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

dff*_*dff 2 sorting perl hash

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

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

DVK*_*DVK 7

  • 如果要按值顺序打印哈希,则只需比较sort块中的值而不是比较键本身:

     { $wordHash{$b} <=> $wordHash{$a} } 
     # The rest of your code stands
    
    Run Code Online (Sandbox Code Playgroud)

    这是有效的,因为使用的块sort可以是任意逻辑的任何匿名子程序; 只要它返回正/ 0 /负值.

  • 如果你只想要排序的值而不管键,甚至更简单(看起来有点无意义,所以我假设你想要前一个选项,但以防万一我也会回答这个问题):

     sort {$b <=> $a} values %wordHash
    
    Run Code Online (Sandbox Code Playgroud)
  • 此外,如果要按键顺序打印但按字母顺序而不是数字排序,则默认排序按词法排序(相同{ $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
    
    Run Code Online (Sandbox Code Playgroud)