use strict; use warnings; use Data::Dump qw/pp dd/; my %h1 = ( 'Tim' => { 'abc' => 7, 'def' => 7, 'ghi' => 0 }, 'Adam' => { 'abc' => 0, 'def' => 0, 'ghi' => 0 }, 'keas' => { 'abc' => 0, 'def' => 0, 'ghi' => 0 } ); my %h2 = ( 'Dav' => { 'jkl' => 12, 'mno' => 34, 'pqr' => 45 }, 'Adam' => { 'jkl' => 7, 'mno' => 0, 'pqr' => 7 } ); my %joined_1st = (%h1,%h2); #pp \%joined_1st; my %joined_2nd = map { $_ => { %{ $h1{$_} // {} }, %{ $h2{$_} // {} } } } keys %joined_1st; pp \%joined_2nd;