2012-07-30 101 views
0

我對Perl很新穎,需要快速完成任務。任何幫助表示讚賞!在Perl中比較數值的兩個哈希值按價值比較Perl

我有陣列的兩個哈希如下:

Hash 1 
------- 
w: ['A','B','C'] 
e: ['P','Q','R'] 

Hash 2 
------- 
w:['A','B','C'] 
e:['P','Q','O'] 
r:['S','T'] 

語境:

  1. 我想找到在同一個密鑰(例如哈希1沒有 值'值型差分O'從相同的密鑰'e'的哈希2得到。

  2. 找出密鑰的不同(例如'r'不存在於散列1中。

我把一些代碼放在一起,但它檢查兩個哈希完整行的確切值。例如,如果我在散列1中爲密鑰w和'B','C'中的'A','B','C',散列2中的'A'爲相同的密鑰,如果標記差異。我想按價值比較價值 -

以下代碼比較兩個散列os數組。所以從上面的例子中,散列1中的A,B,C不等於散列2中的B,A,C。但是我想檢查單個項的存在,並且不用擔心順序。

for (keys %hash2) 
{  
    unless (exists $hash1{$_}) # Checks for mismatches in keys 
    {   
     print "$_: Key mismatch $_ received \n"; 
     next;  
    }  

    if ($hash2{$_} eq $hash1{$_}) #Compares two lines exactly   
    {   
     print "$_: No mismatch \n"; 
    }  
    else 
    {  
     print "$_: Value mismatch for key $_ \n"; #Difference in Value 
    } 
} 
+1

請格式化您的問題。 (1)正確縮進代碼,以便使用代碼格式呈現代碼(和* only *代碼)。 (2)當你正在討論一個數組時,不要使用hashref文字語法'{}',*當你正在討論一個哈希時使用它。 – Quentin 2012-07-30 16:43:06

回答

0

如果你不關心的訂單,只是比較有序的一組值:

代碼:

if ($hash2{$_} eq $hash1{$_}) #Compares two lines exactly  

應該是:

if ( join(",", sort @{ $hash1{$_}}) 
     eq join(",", sort @{ $hash2{$_}})) #Compares two lines exactly  

另一方面,如果你想比較陣營的成員資格YS,只需打開陣列成hashref:

foreach my $key2 (keys %hash2) { 
    unless (exists $hash1{$key2}) { print ""; next; }; 

    my %subhash1 = map { ($_ => 1) } @{ $hash1{$key} }; 
    my %subhash2 = map { ($_ => 1) } @{ $hash2{$key} }; 

    # Compare 2 subhashes same way you are comparing parent hashes in inner loop 

    foreach my $subkey2 (keys %subhash2) { 
     # Check for exists 
     ... 
    } 
} 
+0

謝謝!這就是我想要做的! – stream 2012-07-30 17:04:12

0

如果不重複陣列的成員,可以使用完全相同的算法找出差異作爲哈希鍵。因此,您可以將其設置爲子程序:

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

my %h1 = (
      w => ['A','B','C'], 
      e => ['P','Q','R'], 
      q => [], 
     ); 
my %h2 = (
      w => ['A','B','C'], 
      e => ['P','Q','O'], 
      r => ['S','T'], 
     ); 


my @diff = list_diff(keys %h1, keys %h2); 
print "Difference in keys: ", @diff, "\n" if @diff; 

KEY: 
foreach my $key (keys %h1) { 
    next KEY unless exists $h2{$key}; 
    my @diff = list_diff(@{ $h1{$key} },@{ $h2{$key} }); 
    print "Difference at key $key: ", @diff, "\n" if @diff; 
} 


sub list_diff { 
    my %keys; 
    $keys{$_}++ for @_; 
    return grep 2 != $keys{$_}, keys %keys; 
}