my $VAR1 = { 'Tim' => { 'abc' => 7, 'def' => 7, 'ghi' => 0 }, 'Adam' => { 'abc' => 0, 'def' => 0, 'ghi' => 0 }, 'keas' => { 'abc' => 0, 'def' => 0, 'ghi' => 0 } }; my $VAR2 = { 'Dav' => { 'jkl' => 12, 'mno' => 34, 'pqr' => 45 }, 'Adam' => { 'jkl' => 7, 'mno' => 0, 'pqr' => 7 } }; my %output; $output{$_} ||= {( %{$VAR1->{$_}}, %{$VAR2->{$_}} )} for keys(%$VAR1), keys(%$VAR2); use Data::Dumper; print Dumper \%output;