2012-06-27 39 views
2

我想了解perl中的一段代码,但是我遇到了一些麻烦,它对perl编程有点新鲜。在perl中使用ne比较两个哈希

我有两个散列,它们在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输出! 这可能是什么?

任何帮助将不胜感激。

回答

10

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

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

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

比较哈希的一种方法是使用JSON:XScanonical集对它们进行字符串化。

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

这是非常有益的。谢谢。为了澄清,我认为用过的桶的数量与哈希中的键的数量相同吗? – abhIta

+4

没有。哈希表的核心是一个链接列表数组。 “桶”是赋予该数组元素的名称。散列的每个元素都是链接列表的一个元素,而不是数组的元素。密钥的数量和桶的数量之间没有任何关系。 [哈希表](http://en.wikipedia.org/wiki/Hash_table) – ikegami

+0

谢谢! – abhIta

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