my %hash = ( a => 1, b => 1, c => 1, d => 2, e => 2, f => 2, ); my %by_value; while(my($key, $value) = each %hash) { push @{ $by_value{$value} }, $key; } print Dumper(\%by_value);