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; #### $VAR1 = { 'h' => [ 'd' ], 'g' => [ 'b' ], 'f' => [ 'e', 'c', 'a' ] };