ハッシュのリファレンス同士のマージ.

ハッシュのリファレンス同士をマージさせるには,
CPAN モジュールの Hash::Merge を使うと便利です.

ただし, Hash::Merge を使わなくても数行でいけます.

## $hashref1 に $hashref1 をマージする.
my $hash1 = +{};
my $hash2 = +{};

my @array = keys %$hash2;
my $hoge = undef;
for (@array) {
$hoge = $hash2->{$_};
$hash1->{$_} = $hoge;
}

以下, man Hash::Merge

NAME
Hash::Merge - Merges arbitrarily deep hashes into a single hash

SYNOPSIS
use Hash::Merge qw( merge );
my %a = (
’foo’ => 1,
’bar’ => [ qw( a b e ) ],
’querty’ => { ’bob’ => ’alice’ },
);
my %b = (
’foo’ => 2,
’bar’ => [ qw(c d) ],
’querty’ => { ’ted’ => ’margeret’ },
);

my %c = %{ merge( \%a, \%b ) };

Hash::Merge::set_behavior( ’RIGHT_PRECEDENT’ );

# This is the same as above

Hash::Merge::specify_behavior(
{
’SCALAR’ => {
’SCALAR’ => sub { $_[1] },
’ARRAY’ => sub { [ $_[0], @{$_[1]} ] },
’HASH’ => sub { $_[1] },
},
’ARRAY => {
’SCALAR’ => sub { $_[1] },
’ARRAY’ => sub { [ @{$_[0]}, @{$_[1]} ] },
’HASH’ => sub { $_[1] },
},
’HASH’ => {
’SCALAR’ => sub { $_[1] },
’ARRAY’ => sub { [ values %{$_[0]}, @{$_[1]} ] },
’HASH’ => sub { Hash::Merge::_merge_hashes( $_[0], $_[1] ) },
},
},
’My Behavior’,
);