比较两个哈希值perl

时间:2014-06-18 14:26:43

标签: perl hash compare

休息后我正在研究perl。如果我不清楚请问。

我有哈希哈希。

REST123=>{'test' => 'A',
          'test1'=> 'B',
          'test2'=> 'C'
          'test3'=> 'D'
         }
REST425=>{'test' => 'A',
          'test1'=> 'C',
          'test2'=> 'C'
          'test3'=> 'B'
         }

REST234=>{'test' => 'A',
          'test1'=> 'B',
          'test2'=> 'C'
          'test3'=> 'D'
         }

我想比较所有REST *中的ABCD.REsult应该是这样的。

REST123 REST425 4 1(mismatch) 
REST123 REST234 4 0 (mismatch)

我尝试在另一个上复制哈希,但这不起作用。任何简单的方式来访问它们进行比较都会非常感激

谢谢

1 个答案:

答案 0 :(得分:0)

我不得不猜一下,但我的水晶球告诉我你需要以下代码。

#!/usr/bin/perl
use warnings;
use strict;

my %hash
    = (
       REST123 => { test  => 'A',
                    test1 => 'B',
                    test2 => 'C',
                    test3 => 'D',
                  },
       REST425 => { test  => 'A',
                    test1 => 'C',
                    test2 => 'C',
                    test3 => 'B',
                  },
       REST234 => { test  => 'A',
                    test1 => 'B',
                    test2 => 'C',
                    test9 => 'D',
                  },
      );

for my $k1 (keys %hash) {
    for my $k2 (grep $k1 gt $_, keys %hash) {
        my %h;
        $h{$_} ++ for map keys %{ $hash{$_} }, $k1, $k2;
        my @same = grep $h{$_} == 2, keys %h;
        print join ' ', $k1, $k2, scalar @same,
            scalar grep $hash{$k1}{$_} ne $hash{$k2}{$_}, @same;
        print "\n";
    }
}

请注意,它会返回2个不匹配项,而不是1,因为'B' ne 'C'(test1)和'D' ne 'B'(test3)。