0

私は Perl の初心者で、タスクをすばやく完了する必要があります。どんな助けでも大歓迎です!

次のように、配列の 2 つのハッシュがあります。

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 には、同じキー「e」のハッシュ 2 とは値「O」がありません。

  2. キーの違いを見つけます。(たとえば、'r' はハッシュ 1 には存在しません。

いくつかのコードをまとめましたが、2 つのハッシュから完全な行の正確な値をチェックします。たとえば、キー w のハッシュ 1 に 'A','B','C' があり、同じキーのハッシュ 2 に 'B', 'C','A' があるとします。値ごとに値を比較したい-

次のコードは、2 つのハッシュ 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
    } 
} 
4

2 に答える 2

0

順序を気にしない場合は、順序付けられた一連の値を比較してください。

あなたのコード:

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

次のようにする必要があります。

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

一方、配列のメンバーシップを比較したい場合は、単に配列を 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
        ...
    }
}
于 2012-07-30T16:58:20.293 に答える
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;
}
于 2012-07-30T17:06:35.730 に答える