对于形如:
my $h = {
a => 'a',
b => 'b',
};
的hash,你要怎么比较他们是否相等呢,比较普遍的方法是遍历所有key,然后看下相应的key在两个hash中对应的value是否相等。可以用hash来记录每个key对应的每个value出现的次数,先记录一个hash,然后再遍历第二个hash的时候,如果发现有个key对应的value出现的次数为1,那么这两个hash即不想等。代码如下所示
#/bin/perl -w
sub is_hash_equal {
my $h = shift;
my $h2 = shift;
my $r = {};
map { $r->{$_}->{$h->{$_}}++ } keys %$h;
my $ans = grep { ++$r->{$_}->{$h2->{$_}} == 1} keys %$h2;
if ($ans) {
return "not equal\n";
} else {
return "equal\n";
}
}
my $h = {
a => 'a',
b => 'b',
};
my $h2 = {
a => 'a',
b => 'b',
};
my $h3 = {
a => 'ab',
b => 'd',
c => 'cd',
};
my $ret = is_hash_equal($h, $h2);
print $ret;
$ret = is_hash_equal($h, $h3);
print $ret;
$ret = is_hash_equal($h2, $h3);
print $ret;