Слияние хэшей в Perl: особый случай

Как объединить два хэша в Perl, где ключи могут конфликтовать, а значения являются массивами.? В случае столкновения я хочу объединить массивы значений.

Подойдет ли обычное слияние?

Извините, если это повтор, но я пытался найти, но ничего такого конкретного не обнаружилось.

Спасибо!


person peterd    schedule 12.12.2012    source источник
comment
Вы должны сделать это самостоятельно. Перебирать один хэш, искать в другом, объединять массивы для каждого столкновения.   -  person Jim Garrison    schedule 12.12.2012


Ответы (2)


Чтобы объединить %hoa2 с %hoa1:

for (keys(%hoa2)) {
   push @{ $hoa1{$_} }, @{ $hoa2{$_} };
}
person ikegami    schedule 12.12.2012
comment
Мне нравится лаконичное решение. - person ddoxey; 12.12.2012
comment
Тогда вам понравится push @{ $hoa1{$_} }, @{ $hoa2{$_} } for keys(%hoa2); :) - person ikegami; 31.05.2017

Значения этих хэшей являются ссылками на массивы.

#!/usr/bin/perl -Tw

use strict;
use warnings;
use Data::Dumper;

# The array ref of the first hash will be clobbered by
# the value of the second.
{
    my %hash_a = ( a => [ 1, 2, 3 ] );
    my %hash_b = ( a => [ 4, 5, 6 ] );

    @hash_a{qw( a )} = @hash_b{qw( a )};

    print Dumper( \%hash_a );
}

#  To merge the values of the arrays you'd need to handle that like this.
{
    my %hash_a = ( a => [ 1, 2, 3 ] );
    my %hash_b = ( a => [ 4, 5, 6 ] );

    @{ $hash_a{a} } = ( @{ $hash_a{a} }, @{ $hash_b{a} } );

    print Dumper( \%hash_a );
}

Вывод этой программы:

$VAR1 = {
          'a' => [
                   4,
                   5,
                   6
                 ]
        };
$VAR1 = {
          'a' => [
                   1,
                   2,
                   3,
                   4,
                   5,
                   6
                 ]
        };

Надеюсь, это поможет.

person ddoxey    schedule 12.12.2012
comment
Помимо отсутствующего цикла, это не завершено, поскольку предполагается, что ключ существует в обоих хэшах. - person ikegami; 12.12.2012
comment
Мой ответ призван проиллюстрировать, как работает структура данных. Я бы не ожидал, что это будет решение для копирования и вставки. Я упускаю суть? - person ddoxey; 12.12.2012