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; #### { Adam => { abc => 0, def => 0, ghi => 0, jkl => 7, mno => 0, pqr => 7 }, Dav => { jkl => 12, mno => 34, pqr => 45 }, keas => { abc => 0, def => 0, ghi => 0 }, Tim => { abc => 7, def => 7, ghi => 0 }, }