2

我试图理解 perl 中的一段代码,但我遇到了一些麻烦,因为它对 perl 编程来说有点新。

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

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

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

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

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

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

我的问题是:

(1) 上面的 if 语句究竟比较了什么?

(2)我尝试分配,

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

但是这些给了我 3/8 的输出!那会是什么?

任何帮助将不胜感激。

4

2 回答 2

10

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

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

因此,它比较了两个散列具有相同数量的已使用存储桶,并且两个散列具有相同数量的已分配存储桶。

比较散列的一种方法是使用带有集合的JSON:XS对它们进行字符串化。canonical

JSON::XS->new->canonical(1)->encode(\%hash)
于 2012-06-27T21:01:04.430 回答
0

有一个 Module 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

于 2012-06-28T08:44:47.813 回答