my %val_by_key = ( 1 => 'a', 2 => 'b', 3 => 'a', 4 => 'c', ); my %keys_by_val foreach my $k (keys %vals_by_key) { my $v = $vals_by_key{$k}; push @{ $keys_by_val{$v} }, $k; } # a: 1, 3 print('a: ', join(', ', @{$keys_by_val{'a'}}), "\n"); # a: 1, 3 # b: 2 # c: 4 foreach my $v (keys %keys_by_val) { print("$v: ", join(', ', @{$keys_by_val{$v}}), "\n"); }