Translate

2013年10月7日月曜日

perlのオブジェクト同士を比較する時の、演算子による挙動の違いを実験

perlにおいてオブジェクト同士を比較する時、==を使うべきかeqを使うべきか若干悩んで、検証してみる事にした。 まずはソース。
# cat /tmp/test.pl
use strict;
use warnings;
use utf8;
use 5.010;
use Data::Dumper;
{
        package Hoge;
        sub new()
        {
                my $class = shift;

                my $hash = {
                        id   => int(rand 10),
                        name => int(rand 10)
                };
                bless $hash,$class;
        }
}

my $obj1 = new Hoge;
my $obj2 = $obj1;
say (($obj1 == $obj2) ? 1 : 0);
say (($obj1 eq $obj2) ? 1 : 0);

say (($obj1 == $obj3) ? 1 : 0);
say (($obj1 eq $obj3) ? 1 : 0);

1;
で、出力結果がこれ。
# perl /tmp/test.pl
0
0
1
1
2つ目までの出力結果が異なるのは当然として。3つ目がtrueになるのも、下記を読んで納得。
Perlのリファレンス比較は==演算子
問題は最後、4つ目。文字列比較した時に何故一致するんだろうかと。 で、以下のコードを追加。
say qq($obj1 $obj3);
おもむろに実行。該当部分の出力結果を抜粋。
Hoge=HASH(0x8d74968) Hoge=HASH(0x8d74968)
なるほど、blessされたリファレンスを文字列として評価すると、"クラス名=型(アドレス)"と解釈されるのか。