我试图理解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! 那可能是什么?
非常感谢任何帮助。
答案 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