Как объединить хэши в Perl?
каков наилучший способ объединить оба хэша в %hash1? Я всегда знаю, что %hash2 и %hash1 всегда имеют уникальные ключи. Я бы также предпочел одну строку кода, если это возможно.
$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';
4 ответов
быстрый ответ (TL;DR)
%hash1 = (%hash1, %hash2) ## or else ... @hash1{keys %hash2} = values %hash2; ## or with references ... $hash_ref1 = { %$hash_ref1, %$hash_ref2 };
обзор
- контекст: Perl 5.x
- : пользователь хочет объединить два хэши1 в одну переменную
решение
- используйте синтаксис выше для простых переменных
- используйте Hash:: Merge для сложных вложенных переменных
подводные камни
- Что делать когда оба хэша содержат один или несколько дубликатов ключей
- должна ли пара ключ-значение с пустым значением когда-либо перезаписывать пару ключ-значение с непустым значением?
- что представляет собой пустое и непустое значение в первую очередь? (напр.
undef
, пустую строку,false
, falsy ...) - (Примечание: исходный вопрос исключает этот сценарий, но это важно учитывать)
посмотреть также
- PM сообщение о слиянии хэшей
- PM категорический хеш-Союз Q&A
- Поваренная Книга Perl 5.10. Слияние Хэшей
- websearch: / / perlfaq "объединить два хэша"
- вы://в Perl хэш-объединения
- https://metacpan.org/pod/Hash::Merge
сноски
1 * (он же ассоциативный массив, иначе словарь)
проверить perlfaq4: как объединить два хэша. В документации Perl уже есть много хорошей информации, и вы можете получить ее сразу, а не ждать, пока кто-то другой ответит на нее. :)
прежде чем вы решите объединить два хэша, вы должны решить, что делать, если оба хэша содержат ключи, которые одинаковы, и если вы хотите оставить исходные хэши, как они были.
Если вы хотите сохранить исходные хэши, копия один хэш (%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;
Это старый вопрос, но выходит высоко в моем поиске Google для "Perl merge hashes" - и все же он не упоминает очень полезный модуль CPAN Hash:: Merge
для хэш-ссылки. Вы должны использовать фигурные скобки следующим образом:
$hash_ref1 = {%$hash_ref1, %$hash_ref2};
и не предлагаемый ответ, используя скобки:
$hash_ref1 = ($hash_ref1, $hash_ref2);