web-dev-qa-db-ja.com

Perlでハッシュを結合するにはどうすればよいですか?

両方のハッシュを%hash1に結合する最良の方法は何ですか? %hash2と%hash1には常に一意のキーがあることを常に知っています。また、可能であれば、1行のコードを好むでしょう。

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';
91
mleykamp

クイックアンサー(TL; DR)

 
%hash1 =(%hash1、%hash2)
 
 ##または... 
 
 @ hash1 {キー%hash2} =値%hash2; 
 
 ##または参照あり... 
 
 $ hash_ref1 = {%$ hash_ref1、%$ hash_ref2}; 
 

概要

  • コンテキスト:Perl 5.x
  • 問題:ユーザーが2つのハッシュをマージしたい1 単一の変数に

解決

  • 上記の構文を単純な変数に使用します
  • 複雑なネストされた変数にHash :: Mergeを使用します

落とし穴

こちらもご覧ください


脚注

1 *(別名 連想配列 、別名 辞書

160
dreftymac

perlfaq4:2つのハッシュをマージする方法 を確認してください。 Perlのドキュメントにはすでに多くの優れた情報があり、他の誰かが答えるのを待つのではなく、すぐにそれを手に入れることができます。 :)


2つのハッシュをマージすることを決定する前に、両方のハッシュに同じキーが含まれていて、元のハッシュをそのまま残したい場合にどうするかを決定する必要があります。

元のハッシュを保持する場合は、1つのハッシュ(%hash1)を新しいハッシュ(%new_hash)にコピーしてから、他のハッシュ(%hash2)のキーを新しいハッシュに追加します。キーが%new_hashに既に存在することを確認します重複をどうするかを決める機会を与えてくれます:

my %new_hash = %hash1; # make a copy; leave %hash1 alone

foreach my $key2 ( keys %hash2 )
    {
    if( exists $new_hash{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $new_hash{$key2} = $hash2{$key2};
        }
    }

新しいハッシュを作成したくない場合でも、このループ手法を使用できます。 %new_hashを%hash1に変更するだけです。

foreach my $key2 ( keys %hash2 )
    {
    if( exists $hash1{$key2} )
        {
        warn "Key [$key2] is in both hashes!";
        # handle the duplicate (perhaps only warning)
        ...
        next;
        }
    else
        {
        $hash1{$key2} = $hash2{$key2};
        }
    }

あるハッシュが他のハッシュのキーと値を上書きすることを気にしない場合は、ハッシュスライスを使用して、あるハッシュを別のハッシュに追加できます。この場合、共通のキーがある場合、%hash2の値が%hash1の値を置き換えます。

@hash1{ keys %hash2 } = values %hash2;
38
brian d foy

これは古い質問ですが、「Perl merge hashes」のGoogle検索で高く出ていますが、非常に役立つCPANモジュールについては言及していません Hash :: Merge

14
LeeGee

ハッシュ参照用。次のような中括弧を使用する必要があります。

$hash_ref1 = {%$hash_ref1, %$hash_ref2};

およびnot括弧を使用した上記の提案された答え:

$hash_ref1 = ($hash_ref1, $hash_ref2);
5
JeanieJ