Normally sorting based on keys and then iterating a hash can be done as follows:
for $k (sort (keys %h)) {
print $k, $h{$k};
}
But how can I do the sorting based on values and then iterate through the hash? I can think of creating a new hash by swapping the key and value pairs. But is there a cleverer way of doing this?
If you want the sort comparator to be something other than cmp
, you can supply a code block or a subroutine as the first parameter to sort
. See the documentation for more details.
my %h = (
aaaa => 'z',
bbb => 'x',
c => 'y',
);
# Sort on hash values.
for my $k (sort {$h{$a} cmp $h{$b}} keys %h) {
print $k, "\n"; # bbb c aaaa
}
# Sort using a named subroutine.
for my $k (sort by_length keys %h) {
print $k, "\n"; # c bbb aaaa
}
sub by_length {
length($a) <=> length($b);
}