使用ne比较perl中的两个哈希值

时间:2012-06-27 20:54:15

标签: perl comparison

我试图理解perl中的一段代码,但是我遇到了一些麻烦,因为它是perl编程的新东西。

我有两个哈希,它们在for循环的不同迭代中以相同的顺序输入相同的(键,值)对。

迭代1创建%hash1,迭代2创建%hash2。

%hash1 = (1 => 10, 2 => 20, 3=> 30);

%hash2 = (1 => 10,  2 => 20, 3=> 30);

然后一个比较这些的命令:as,

if (%hash1 ne %hash2) {print "Not Equal"; die;}

我的问题是:

(1)在上述if语句中究竟有什么比较?

(2)我尝试过分配,

my $a = %hash1; my $b = %hash2;

但这些给我输出像3/8! 那可能是什么?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:10)

ne是字符串比较运算符。它的操作数是字符串,因此是标量。来自perldata

如果在标量上下文中计算散列,则在散列为空时返回false。如果有任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔。

因此,比较两个哈希值都使用相同数量的哈希值,并且两个哈希值都具有相同数量的已分配桶。

比较哈希值的一种方法是使用JSON:XS设置canonical对其进行字符串化。

JSON::XS->new->canonical(1)->encode(\%hash)

答案 1 :(得分:0)

有一个模块Data::Compare可用于比较CPAN上的哈希值。其工作原理如下:

 use Data::Compare; # exports subroutine: Compare() !
 ...

 my %hash1 = (1 => 10, 2 => 20, 3 => 30);
 my %hash2 = (1 => 10, 2 => 20, 3 => 30);

 # This won't work:
 # if (%hash1 ne %hash2) {print "Not Equal"; die;}

 # This works:
 if( ! Compare(\%hash1, \%hash2)  ) {  print "Not Equal";  die; }

 ...

这不是核心模块,您必须安装它。它也可以在activeperl / windows下(在默认存储库中)。

此致

RBO