Как я могу объединить хэши в Perl? - PullRequest
88 голосов
/ 08 декабря 2008

Каков наилучший способ объединить оба хэша в% hash1? Я всегда знаю, что% hash2 и% hash1 всегда имеют уникальные ключи. Я также предпочел бы одну строку кода, если это возможно.

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

Ответы [ 4 ]

157 голосов
/ 08 декабря 2008

Быстрый ответ (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 для сложных вложенных переменных

Ловушки

Смотри также


Сноска

1 * (он же ассоциативный массив , он же словарь )

38 голосов
/ 08 декабря 2008

Проверьте 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;
14 голосов
/ 13 февраля 2013

Это старый вопрос, но в моем поиске в Google он находит «perl merge hashes», но в нем не упоминается очень полезный модуль CPAN Hash :: Merge

5 голосов
/ 15 сентября 2017

Для ссылок на хеш. Вы должны использовать фигурные скобки, как показано ниже:

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

и не предложенный выше ответ с использованием скобок:

$hash_ref1 = ($hash_ref1, $hash_ref2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...