my %original_hash = ( first => 'alpha', second => 'beta', prime => 'alpha', ); foreach $key (keys %original_hash) { push @{$reverse_hash{$original_hash{$key}}}, $key; } foreach $rkey (keys %reverse_hash) { print "$rkey = ".(join ', ', @{$reverse_hash{$rkey}})."\n"; } print "\n"; my %test_hash = reverse %original_hash; foreach $tkey (keys %test_hash) { print "$tkey = $test_hash{$tkey}\n"; }