103

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

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

4 に答える 4

177

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

    %hash1 = (%hash1, %hash2)

    ## または ...

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

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

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

概要

  • コンテキスト: Perl 5.x
  • 問題:ユーザーは 2 つのハッシュ1を 1 つの変数にマージしたいと考えています。

解決

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

落とし穴

こちらもご覧ください


脚注

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

于 2008-12-08T16:17:06.893 に答える
40

perlfaq4: How do I merge two hashes を確認してください。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;
于 2008-12-08T17:08:26.697 に答える
16

これは古い質問ですが、「perl マージ ハッシュ」の Google 検索で上位に出てきますが、非常に役立つ CPAN モジュールHash::Mergeについては言及されていません。

于 2013-02-13T12:02:30.420 に答える