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されたリファレンスを文字列として評価すると、"クラス名=型(アドレス)"と解釈されるのか。