use strict ; use warnings ; use Data::Dumper ; my $VAR1 = { 'data' => { 'dir1' => { 'fileA' => { 'pid' => { '61781' => 1 }, 'total' => 13 }, 'fileB' => { 'pid' => { '61799' => 1 }, 'total' => 12 } }, 'dir2' => { 'fileC' => { 'pid' => { '12345' => 1 }, 'total' => 10 }, 'fileA' => { 'pid' => { '61439' => 1 }, 'total' => 5 } } }, 'total' => { 'fileA' => 18, 'fileB' => 12, 'fileC' => 10, } }; my $VAR2 = { 'data' => { 'dir3' => { 'fileA' => { 'pid' => { '616161' => 1 }, 'total' => 6 }, 'fileD' => { 'pid' => { '54321' => 1 }, 'total' => 12 } }, 'dir4' => { 'fileE' => { 'pid' => { '15151' => 1 }, 'total' => 3 }, 'fileA' => { 'pid' => { '1718' => 1 }, 'total' => 2 } } }, 'total' => { 'fileA' => 8, 'fileD' => 12, 'fileE' => 3, } }; foreach ( grep !exists $VAR1->{ data }->{ $_ }, keys %{$VAR2->{ data }} ) { $VAR1->{ data }->{ $_ } = $VAR2->{ data }->{ $_ } ; foreach my $f ( keys %{$VAR2->{ data }->{ $_ }} ) { $VAR1->{ total }->{ $f } += $VAR2->{ data }->{ $_ }->{ $f }->{ total } ; } } print Dumper( $VAR1 ) ;