【问题标题】:Comparing two hashes in perl using ne使用 ne 比较 perl 中的两个哈希值
【发布时间】:2012-06-28 16:56:12
【问题描述】:

我正在尝试理解 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 之类的输出! 那会是什么?

任何帮助将不胜感激。

【问题讨论】:

    标签: perl comparison


    【解决方案1】:

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

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

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

    比较散列的一种方法是使用JSON:XScanonical 将它们串起来。

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

    【讨论】:

    • 这很有帮助。谢谢。澄清一下,我认为使用的桶数与哈希中的键数相同吗?
    • 不。哈希表的核心是一个链表数组。 “Buckets”是该数组元素的名称。散列的每个元素都是链表的元素,而不是数组的元素。键的数量和桶的数量之间没有关系。 Hash table
    【解决方案2】:

    有一个模块 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

    【讨论】:

      猜你喜欢
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多