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

使用ne比较perl中的两个哈希,perl,comparison,Perl,Comparison,我试图理解perl中的一段代码,但由于它是perl编程的新手,我遇到了一些麻烦 我有两个散列,它们在for循环的不同迭代中以相同的顺序输入相同的(键,值)对 迭代1创建%hash1,迭代2创建%hash2 %hash1=(1=>10,2=>20,3=>30) 然后一个比较这些的命令:如下所示 if (%hash1 ne %hash2) {print "Not Equal"; die;} 我的问题是: (1) 在上面的if语句中,究竟比较了什么 (2) 我试着分配 my $a = %hash1;

我试图理解perl中的一段代码,但由于它是perl编程的新手,我遇到了一些麻烦

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

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

%hash1=(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! 那会是什么


非常感谢您的帮助。

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

如果在标量上下文中计算哈希,则如果哈希为空,则返回false。如果存在任何键/值对,则返回true;更准确地说,返回的值是一个字符串,由使用的桶数和分配的桶数组成,用斜杠分隔。 因此,这是比较两个哈希具有相同数量的已用桶和两个哈希具有相同数量的已分配桶

比较散列的一种方法是使用with
canonical
set将它们字符串化

JSON::XS->new->canonical(1)->encode(\%hash)
有一个模块可用于比较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

这非常有帮助。谢谢我只是想澄清一下,我认为使用的桶的数量与散列中的键的数量相同,对吗?不对。哈希表的核心是一个链表数组。“bucket”是该数组元素的名称。散列的每个元素都是链表的元素,而不是数组的元素。键的数量和存储桶的数量之间没有关系。
 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; }

 ...