2012-09-24 83 views
5

這是我的散列的轉儲:%HASH1哈希合併/級聯

$VAR1 = { 
    abc => { 
     123 => [ 
      'xx', 
      'yy', 
      'zy' 
     ], 
     456 => [ 
      'ab', 
      'cd', 
      'ef' 
     ] 
    } 
}; 

,第二個:%HASH2

$VAR2 = { 
    def => { 
     659 => [ 
      'wx', 
      'yg', 
      'kl' 
     ], 
     456 => [ 
      'as', 
      'sd', 
      'df' 
     ] 
    }, 
    abc => { 
     987 => [ 
      'lk', 
      'dm', 
      'sd' 
     ] 
    } 
}; 

現在,我想在一個新的哈希這兩個散列合併,但是如果一個鍵被重複(這裏'abc'),這些值應該被追加,而不是被替換,所以鍵應該保持唯一,並且所有的值也應該被保留。這怎麼能在Perl中完成? 輸出應該如下:

$VAR1 = { 
    def => { 
     659 => [ 
      'wx', 
      'yg', 
      'kl' 
     ], 
     456 => [ 
      'as', 
      'sd', 
      'df' 
     ] 
    }, 
    abc => { 
     987 => [ 
      'lk', 
      'dm', 
      'sd' 
     ], 
     123 => [ 
      'xx', 
      'yy', 
      'zy' 
     ], 
     456 => [ 
      'ab', 
      'cd', 
      'ef' 
     ] 
    } 
}; 
+0

你能給我一個合併後的數據的例子結構,例如在'%a =(key1 => {key2 => [1]})'和'%b =(key1 => {key2 => [1]})之間'當我不知道我要去哪裏的時候,我不知道要走哪條路。 – amon

+0

我已經編輯了必要輸出的主要問題,感謝您的幫助! –

回答

4
for my $x (keys(%h2)) { 
    for my $y (keys(%{ $h2{$x} })) { 
     push @{ $h1{$x}{$y} }, @{ $h2{$x}{$y} }; 
    } 
} 
+0

不起作用:'不能在XX行使用一個未定義的值作爲ARRAY參考,' – Zaid

+0

@Zaid,雖然缺少美元符號,但我沒有看到這個錯誤。固定。我不得不在未經測試的情況下衝出去,但現在的版本已經過測試。 – ikegami

+0

問題出在我身上...錯誤地重新標記了var名稱 – Zaid

0
sub merge_hashes { 
    my ($h1, $h2) = @_; 
    foreach my $key (keys %$h2) { 
     if (!exists $h1->{$key} || ref($h1->{$key}) ne 'HASH' || ref($h2->{$key}) ne 'HASH') { 

      $h1->{$key} = $h2->{$key}; 
     } 
     else { 
      merge_hashes($h1->{$key}, $h2->{$key}); 
     } 
    } 
} 

merge_hashes(\%hash1, \%hash2); 
0

對提供的樣本數據,下面將進行合併你描述:

my %merged = map { 
       $_ => { 
         %{$a{$_} // {}}, 
         %{$b{$_} // {}} 
        } 
      } (keys %a, keys %b); 

測試:

use strict; 
use warnings; 
use Data::Dump 'dd'; 

my %a = (
abc => { 
     123 => [ 
      'xx', 
      'yy', 
      'zy' 
     ], 
     456 => [ 
      'ab', 
      'cd', 
      'ef' 
     ] 
    } 
); 
my %b = (
def => { 
     659 => [ 
      'wx', 
      'yg', 
      'kl' 
     ], 
     456 => [ 
      'as', 
      'sd', 
      'df' 
     ] 
    }, 
    abc => { 
     987 => [ 
      'lk', 
      'dm', 
      'sd' 
     ] 
    } 
); 

my %merged = map { 
        $_ => { 
          %{$a{$_} // {}}, 
          %{$b{$_} // {}} 
         } 
       } (keys %a, keys %b); 

dd \%merged; 
# { 
# abc => { 
#   123 => ["xx", "yy", "zy"], 
#   456 => ["ab", "cd", "ef"], 
#   987 => ["lk", "dm", "sd"], 
#   }, 
# def => { 456 => ["as", "sd", "df"], 659 => ["wx", "yg", "kl"] }, 
# }