If you're going to do this repeatedly (e.g. first find all the keys with value 'a', then find all keys with value 'b', etc.), then it might help to create a hash that maps the values to keys.
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");
}