我正在尝试使用此代码,但它尝试对键进行排序,但由于它们不是数字,因此无法对其进行排序。
foreach my $word (sort {$b <=> $a} keys %wordHash) {
printf ("%-20s %10d\n", $word, $wordHash{$word});
}
答案 0 :(得分:7)
如果您想按照值顺序打印哈希,那么您只需要比较sort
块中的值,而不是比较键本身:
{ $wordHash{$b} <=> $wordHash{$a} }
# The rest of your code stands
这是有效的,因为sort
中使用的块可以是具有任意逻辑的任何匿名子例程;只要它返回正/ 0 /负值。
如果您只想要排序的值而不管键,甚至更简单(看起来有点无意义,所以我假设你想要前一个选项,但以防万一我也会回答这个) :
sort {$b <=> $a} values %wordHash
此外,如果您想按键顺序打印,但按字母顺序而不是数字排序,则默认排序sorts lexically(与{ $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