Как я могу объединить хеши в Perl?

92
задан dreftymac 31 October 2015 в 17:04
поделиться

2 ответа

Быстрый Ответ (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 в единственную переменную

использование Решения

  • синтаксис выше для простых переменных
  • Хеш использования:: Слияние для комплекса вложило переменные

Ловушки

См. также

<час>

Сноски

<глоток> 1 * (иначе ассоциативный массив , иначе словарь )

162
ответ дан dreftymac 24 November 2019 в 06:26
поделиться

Выезд 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;
38
ответ дан Hans Ginzel 24 November 2019 в 06:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: