You could try something recursive like this:
use warnings;
use strict;
use Data::Dump::Streamer;
my %hash1 = (
foo => 'bar',
baz => { quux => 'qwe',
rty => 'uiop', },
perl => ['monks', 'monastery', 'robes'],
);
my %hash2 = (
wizardry => 'hocus-pocus',
foo => 'f00',
baz => { grail => 'arthur', },
perl => ['yayy', 'yippee'],
hash3 => {key1 => 'value1', key2 => 'value2', },
);
merge (\%hash2, \%hash1);
Dump (\%hash1);
sub merge {
my ($source, $target) = @_;
for (keys %$source) {
if ('ARRAY' eq ref $target->{$_}) {
push @{$target->{$_}}, @{$source->{$_}};
} elsif ('HASH' eq ref $target->{$_}) {
merge ($source->{$_}, $target->{$_});
} else {
$target->{$_} = $source->{$_};
}
}
}
$HASH1 = {
baz => {
grail => 'arthur',
quux => 'qwe',
rty => 'uiop'
},
foo => 'f00',
hash3 => {
key1 => 'value1',
key2 => 'value2'
},
perl => [
'monks',
'monastery',
'robes',
'yayy',
'yippee'
],
wizardry => 'hocus-pocus'
};
DWIM is Perl's answer to Gödel