Bagaimana cara menggabungkan hash di Perl?

95

Apa cara terbaik untuk menggabungkan kedua hash menjadi% hash1? Saya selalu tahu bahwa% hash2 dan% hash1 selalu memiliki kunci unik. Saya juga lebih suka satu baris kode jika memungkinkan.

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

Jawaban:

168

Jawaban Cepat (TL; DR)

    % hash1 = (% hash1,% hash2)

    ## atau lainnya ...

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

    ## atau dengan referensi ...

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

Gambaran

  • Konteks: Perl 5.x
  • Masalah: Pengguna ingin menggabungkan dua hash 1 menjadi satu variabel

Larutan

  • gunakan sintaks di atas untuk variabel sederhana
  • gunakan Hash :: Merge untuk variabel bersarang yang kompleks

Jebakan

Lihat juga


Catatan kaki

1 * (alias array-asosiatif , alias kamus )

dreftymac.dll
sumber
2
Ya, jika tidak ada benturan kunci, @ hash1 {keys% hash2} = values% hash2; adalah cara tercepat dan terpendek, AFAIK.
kixx
46
mengapa Anda tidak bisa melakukannya%hash1 = (%hash1, %hash2)
user102008
1
Tampaknya bekerja dengan referensi juga: $ hash_ref1 = ($ hash_ref1, $ hash_ref2);
lepe
2
Itu akan diatur $hash_ref1ke $hash_ref2, tidak ada penggabungan. Anda mau $hash_ref1 = { %$hash_ref1, %$hash_ref2 };, saya akan mengedit jawabannya.
M Somerville
38

Lihat perlfaq4: Bagaimana cara menggabungkan dua hash . Ada banyak informasi bagus yang sudah ada di dokumentasi Perl dan Anda dapat langsung mendapatkannya daripada menunggu orang lain menjawabnya. :)


Sebelum Anda memutuskan untuk menggabungkan dua hash, Anda harus memutuskan apa yang harus dilakukan jika kedua hash berisi kunci yang sama dan jika Anda ingin membiarkan hash asli apa adanya.

Jika Anda ingin mempertahankan hash asli, salin satu hash (% hash1) ke hash baru (% new_hash), lalu tambahkan kunci dari hash lain (% hash2 ke hash baru. Memeriksa apakah kunci sudah ada di% new_hash memberi Anda kesempatan untuk memutuskan apa yang harus dilakukan dengan duplikat:

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};
        }
    }

Jika Anda tidak ingin membuat hash baru, Anda masih bisa menggunakan teknik perulangan ini; cukup ubah% new_hash menjadi% 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};
        }
    }

Jika Anda tidak peduli bahwa satu hash menimpa kunci dan nilai dari yang lain, Anda bisa menggunakan potongan hash untuk menambahkan satu hash ke hash lainnya. Dalam kasus ini, nilai dari% hash2 menggantikan nilai dari% hash1 jika keduanya memiliki kunci yang sama:

@hash1{ keys %hash2 } = values %hash2;
brian d foy
sumber
senang menautkan ke perlfaq, dan sumber daya lain di pertanyaan lain
Chris
14

Ini adalah pertanyaan lama, tetapi keluar tinggi dalam pencarian Google saya untuk 'perl merge hashes' - namun tidak menyebutkan modul CPAN yang sangat membantu Hash :: Merge

LeeGee
sumber
jawaban pilihan teratas telah diperbarui untuk menyertakan ini.
dreftymac
6

Untuk referensi hash. Anda harus menggunakan kurung kurawal seperti berikut:

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

dan bukan jawaban yang disarankan di atas menggunakan tanda kurung:

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