use Data::Dumper; my %hash = ( a => 'f', b => 'g', c => 'f', d => 'h', e => 'f', ); my %dups; while (my ($e, $g) = each %hash) { push @{$dups{$g}}, $e } while (my ($g, $e) = each %dups) { say "$g is duplicated in @$e" if @$e > 1; } print Dumper \%dups;