my %hash1 = (a=>4,b=>5,c=>6,d=>7); my %hash2 = (a=>4,b=>5,c=>6,e=>7); { delete local @hash1{keys %hash2}; print "hash1 only: $_\n" for keys %hash1; } { delete local @hash2{keys %hash1}; print "hash2 only: $_\n" for keys %hash2; } # %hash1 and %hash2 are unchanged here __END__ hash1 only: d hash2 only: e