如何在perl中按递减顺序对哈希值进行排序?

时间:2014-05-12 00:07:49

标签: perl sorting hash

我正在尝试使用此代码,但它尝试对键进行排序,但由于它们不是数字,因此无法对其进行排序。

foreach my $word (sort {$b <=> $a} keys %wordHash) {
        printf ("%-20s %10d\n", $word, $wordHash{$word});
}

1 个答案:

答案 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