This does it:
#!/usr/bin/perl -w
use Data::Dumper;
%hash1 = (
red => 1,
brown => {
green => 1,
blue => {
yellow => 1,
},
black => 1,
},
gray => 1,
);
%hash2 = (
white => 1,
brown => {
purple => 1,
},
);
# merge ( \%hash1, \%hash2 ) returns the merge
# If the two hashes have a common (possibly deep) key
# not pointing to hashes, it dies trying to force
# the reference to a hash reference
sub merge {
my ( $h1, $h2 ) = @_;
my %h3;
for my $key ( keys %$h1 ) {
if ( exists $h2->{$key} ) {
$h3{$key} = merge( $h1->{$key}, $h2->{$key} );
} else {
$h3{$key} = $h1->{$key};
}
}
for my $key ( keys %$h2 ) {
unless ( exists $h1->{$key} ) {
$h3{$key} = $h2->{$key};
}
}
return \%h3;
}
print Dumper ( merge( \%hash1, \%hash2 ) );