How can I sort the values of a hash in decreasing order in perl?

hash, perl, sorting

Solution

If you want to print your hash in the values order, then you simply need to compare values in your `sort` block instead of comparing the keys themselves:

 { $wordHash{$b} <=> $wordHash{$a} } 
 # The rest of your code stands

This works because the block used in `sort` can be ANY anonymous subroutine with arbitrary logic; as long as it returns positive/0/negative values.

If you only want sorted values irrespective of keys, even simpler (seems kinda pointless so I assume you wanted the previous option, but just in case I'll answer this as well):

 sort {$b <=> $a} values %wordHash

Also, if you want to print in keys order but sorted alphabetically instead of numerically, default sort sorts lexically (same as `{ $a cmp $b }`):

 sort keys %wordHash               # sort in ascending alphanumeric
 reverse sort keys %wordHash       # sort in descending alphanumeric
 sort { $b cmp $a } keys %wordHash # same: descending alphanumeric,
                                   #   faster on large data but less readable

Problem

I am trying to use this code, but it attempts to sort the keys instead, which it cannot do because they are not numerical. ``` foreach my $word (sort {$b <=> $a} keys %wordHash) { printf ("%-20s %10d\n", $word, $wordHash{$word}); } ```

Original source