use strict; my %hash1 = ( A => 5, B => 7, C => 2, D => 8, ); my %hash2 = ( 1234 => "A,C", 4567 => "A,B,D", 5678 => "C", ); my %hash3; foreach my $key2 ( keys %hash2 ) { my %temphash = %hash1; foreach ( split /,/, $hash2{$key2} ) { delete $temphash{$_}; $hash3{$key2}= join ',', sort keys %temphash; } } foreach my $key ( keys %hash3 ) { print "$key : $hash3{$key}\n"; }