Это объединит хэши, а также примет во внимание неопределенные записи, поэтому они не заменят содержимое.
my %hash = merge(\%hash1, \%hash2, \%hash3);
sub merge {
my %result;
%result = %{ $_[0] };
shift;
foreach my $ref (@_) {
for my $key ( keys %{$ref} ) {
if ( defined $ref->{$key} ) {
$result{$key} = $ref->{$key};
}
}
}
return %result;
}