Как объединить хэши в Perl?
86375 просмотра
4 ответа
Каков наилучший способ объединить оба хэша в% hash1? Я всегда знаю, что% hash2 и% hash1 всегда имеют уникальные ключи. Я также предпочел бы одну строку кода, если это возможно.
$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';
Автор: mleykamp
Источник
Размещён: 17.05.2019 03:33
Ответы (4)
153 плюса
Быстрый ответ (TL; DR)
% hash1 = (% hash1,% hash2) ## или еще ... @ hash1 {keys% hash2} = значения% hash2; ## или со ссылками ... $ hash_ref1 = {% $ hash_ref1,% $ hash_ref2};
обзор
- Контекст: Perl 5.x
- Проблема: пользователь хочет объединить два хэша 1 в одну переменную
Решение
- используйте приведенный выше синтаксис для простых переменных
- использовать Hash :: Merge для сложных вложенных переменных
Ловушки
- Что делать, когда оба хэша содержат один или несколько дубликатов ключей
- Должна ли пара ключ-значение с пустым значением переписывать пару «ключ-значение» с непустым значением?
- Что представляет собой пустое и непустое значение в первую очередь? (например
undef
, нуль, пустая строкаfalse
, ложь ...) - (Примечание: исходный вопрос исключает этот сценарий, но это важно рассмотреть)
Смотрите также
- Сообщение PM о слиянии хэшей
- PM Категорический хеш-союз Q & A
- Perl Cookbook 5.10. Объединение хэшей
- websearch: // perlfaq "объединить два хэша"
- websearch: // perl merge hash
- https://metacpan.org/pod/Hash::Merge
Сноски
1 * (aka ассоциативный массив , aka dictionary )
Автор: dreftymac Размещён: 08.12.2008 04:1738 плюса
Проверьте 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;
Автор: brian d foy
Размещён: 08.12.2008 05:08
14 плюса
Это старый вопрос, но он очень высок в моем поиске Google для «хэшей слияния perl» - и все же он не упоминает очень полезный модуль CPAN. Hash :: Merge
Автор: LeeGee Размещён: 13.02.2013 12:025 плюса
Для хеш-ссылок. Вы должны использовать фигурные скобки, например:
$hash_ref1 = {%$hash_ref1, %$hash_ref2};
а не предлагаемый ответ выше, используя круглые скобки:
$hash_ref1 = ($hash_ref1, $hash_ref2);
Автор: JeanieJ
Размещён: 15.09.2017 07:23
Вопросы из категории :
- perl Как определить, имеет ли переменная число в Perl?
- perl Как я могу проверить STDIN без блокировки в Perl?
- perl Как выполнить подстановку Perl для строки, сохранив оригинал?
- perl Какой самый простой способ установить отсутствующий модуль Perl?
- perl Что происходит с Perl 6?
- dictionary Как вы сортируете словарь по значению?
- dictionary Как объединить два словаря в одном выражении?
- dictionary Как эффективно перебирать каждую запись на карте Java?
- dictionary Как отсортировать список словарей по значению словаря?
- dictionary Sort a Map<Key, Value> by values
- hash Есть ли какая-либо функция хэш-кода в JavaScript?
- hash Есть ли фиксированная точка MD5, где md5 (x) == x?
- hash Какой тип данных использовать для поля хешированного пароля и какой длины?
- hash Почему Java hashCode () в String использует 31 в качестве множителя?
- hash Является ли «двойное хеширование» пароля менее безопасным, чем одноразовое хеширование?
- merge Каковы эффективные способы объединения двух структур в MATLAB?
- merge Межотраслевое слияние в TFS?
- merge Встраивание DLL в скомпилированный исполняемый файл
- merge Как объединить хэши в Perl?