代码之家  ›  专栏  ›  技术社区  ›  cdleary

如何进行简单的Perl哈希等价性比较?

  •  8
  • cdleary  · 技术社区  · 16 年前

    我想知道是否有一个惯用的单行代码或标准的分发包/函数,我可以用它来比较两个Perl哈希值,只使用内置的非祝福类型。哈希值并不相同(它们没有等效的内存地址)。

    8 回复  |  直到 16 年前
        1
  •  13
  •   Lumi    13 年前
        2
  •  4
  •   2 revs<br/>Magilla Gorilla&#13;    16 年前

    %a ~~ %b && [sort values %a] ~~ [sort values %b]
    

    不检查值是否属于相同的键。

    #! perl
    use warnings;
    use strict;
    
    my %a = (eat => "banana", say => "whu whu"); # monkey
    my %b = (eat => "whu whu", say => "banana"); # gorilla
    print "Magilla Gorilla is always right\n" 
        if %a ~~ %b && [sort values %a] ~~ [sort values %b];
    
        3
  •  1
  •   Chris Lutz    16 年前

    我不知道是否有简单的方法或内置的软件包,也不知道当你这样做时会发生什么 %hash1 == %hash2

    sub hash_comp (\%\%) {
      my %hash1 = %{ shift };
      my %hash2 = %{ shift };
      foreach (keys %hash1) {
        return 1 unless defined $hash2{$_} and $hash1{$_} == $hash2{$_};
        delete $hash1{$_};
        delete $hash2{$_};
      }
      return 1 if keys $hash2;
      return 0;
    }
    

    未测试,但如果哈希值具有所有相同的元素和所有相同的值,则应返回0。必须修改此函数以考虑多维哈希。

    use Data::Dumper; 然后将这两个哈希值转储到两个标量变量中,然后比较字符串的相等性。这可能会奏效。

    FreezeThaw 看起来它做了你想做的事。

    请注意,要使用智能匹配(此处不再重复,因为它已经发布),您必须 use feature; 它仅适用于Perl 5.10。但谁还在使用Perl 5.8.8,对吧?

        4
  •  1
  •   alexeykomarov    13 年前

        5
  •  0
  •   sth    15 年前

    ( join("",sort(%hash1)) eq join("",sort(%hash2)) )
    

    哦,等等,这行不通,因为有一些边缘情况,比如:

    %hash1 = { 'aaa' => 'aa'  };
    %hash2 = { 'aa'  => 'aaa' };
    

    因此,最好在join()中使用一个你知道永远不会出现在任何键或值中的字符。如果值是BLOB,这将是一个大问题,但对于其他任何内容,您都可以使用NULL字符“\0”。

    ( join("\0",sort(%hash1)) eq join("\0",sort(%hash2)) )
    

    我知道,它看起来有点难看,但它可以以一种肤浅的方式检查两个哈希值是否相等,这也是大多数人想要的。

        6
  •  0
  •   sth    15 年前

    对于浅哈希:

    (grep {exists %hash2{$_}} keys %hash1) > 0
    
        7
  •  0
  •   OmarOthman Dan Story    10 年前

    您可以使用 eq_deeply 在……里面 Test::Deep::NoTest 。它只返回一个可以检查的布尔值,而不需要额外的测试能力开销 main module .

        8
  •  -1
  •   Janak Nirmal Biju    12 年前

    将哈希值转换为xml文件并进行比较,是的,您可以使用多级。

    sub isEqualHash 
    {
        my ($self,$hash1, $hash2) = @_;
        my  $file1 = "c:/neo-file1.txt";
        my  $file2 = "c:/neo-file2.txt";
        my $xmlObj = XML::Simple->new();
        my $dummy_file = $xmlObj->XMLout($hash1,OutputFile => $file1);
        my $dummy_file = $xmlObj->XMLout($hash2,OutputFile => $file2);
    
        open FILE, "<".$file1;
        my $file_contents1 = do { local $/; <FILE> };
        close(FILE);
    
        open FILE, "<".$file2;
        my $file_contents2 = do { local $/; <FILE> };
        close(FILE);
    
        if($file_contents1 eq $file_contents2)
        {
            return "Passed";
        }
        else
        {
            return "Failed";
        }
    }