my %newbase = ( %oldhash, %newhash ); #### sub prunecheck { my ( $var1, $var2 ) = @_; my @var2keys = (); @var2keys = ( keys %$var2 ) if(ref($var2)=~ /HASH/); return unless defined $var1; for ( ref($var1) ) { if (/HASH/) { if ( !(@var2keys) ) { $$var1 = (); } else { for my $key1( keys %$var1 ) { if ( !exists( $$var2{$key1} ) ) { delete( $$var1{$key1} ); } else { # print "\t$key1\n"; prunecheck( $var1->{$key1}, $var2->{$key1} ); } } } } elsif (/ARRAY/) { foreach (@$var1) { prunecheck( $_, $var2 ) ; } } else { # print "\t\t$var1\n"; } } } prunecheck(\%newbase, \%newhash);