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


95

両方のハッシュを%hash1に組み合わせる最良の方法は何ですか?%hash2と%hash1には常に一意のキーがあることを常に知っています。可能であれば、1行のコードを使用することもできます。

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

回答:


168

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

    %hash1 =(%hash1、%hash2)

    ##またはその他...

    @ hash1 {keys%hash2} =値%hash2;

    ##または参照付き...

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

概観

  • 環境: Perl 5.x
  • 問題:ユーザーは2つのハッシュ1を1つの変数にマージしたい

解決

  • 単純な変数には上記の構文を使用します
  • 複雑な入れ子の変数にはHash :: Mergeを使用します

落とし穴

こちらもご覧ください


脚注

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


2
はい、キーの衝突がない場合、@ hash1 {keys%hash2} = values%hash2; AFAIK、最速で最短の方法です。
kixx 2008

46
なぜあなただ​​けができないのですか%hash1 = (%hash1, %hash2)
user102008

1
参照でも動作するようです:$ hash_ref1 =($ hash_ref1、$ hash_ref2);
lepe

2
これはに設定さ$hash_ref1$hash_ref2、マージされません。あなたが欲しい$hash_ref1 = { %$hash_ref1, %$hash_ref2 };、私は答えを編集します。
Mソマービル

38

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


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

元のハッシュを保持する場合は、1つのハッシュ(%hash1)を新しいハッシュ(%new_hash)にコピーしてから、もう1つのハッシュ(%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;

perlfaqへのリンク、および他の質問の他のリソースへのリンク
Chris

14

これは古い質問ですが、Google検索で「perlマージハッシュ」が高く表示されますが、非常に役立つCPANモジュールHash :: Mergeについては触れられていません。


これを含むように、トップ投票の回答が更新されました。
dreftymac

6

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

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

括弧を使用した上記の推奨回答ではありません

$hash_ref1 = ($hash_ref1, $hash_ref2);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.