如何在perl中显示hash的最高值?

Kab*_*hok 0 perl hash

假设我在哈希中存储了以下信息:

kiwi  15
oranges 25
cherries 30
apples 2
pears 1
Run Code Online (Sandbox Code Playgroud)

我想编写将以降序(按金额)前3个条目显示的代码.所以输出应该是

cherries 30
oranges 25
kiwi 15
Run Code Online (Sandbox Code Playgroud)

我似乎无法找到明确的答案.

Bor*_*din 5

这会像你问的那样做.它使用sort比较块,以相反的顺序比较每个键的相应散列值.然后打印前三个排序键中的每一个以及来自散列的值.

请注意,如果有多个具有相同最高值的哈希元素,则此代码将从共享相同值的那些元素中打印出任意三个元素

use strict;
use warnings;

my %data = qw/
  kiwi     15
  oranges  25
  cherries 30
  apples    2
  pears     1
/;

my @sorted_keys = sort { $data{$b} <=> $data{$a}  } keys %data;

for my $key ( @sorted_keys[0..2] ) {
  print "$key $data{$key}\n";
}
Run Code Online (Sandbox Code Playgroud)

产量

cherries 30
oranges 25
kiwi 15
Run Code Online (Sandbox Code Playgroud)

更新

对于更通用的解决方案,(非核心)List::UtilsBy模块提供了许多实用功能,它们根据对象列表提供排序,最大值和最小值.它让我写上面的内容

use List::UtilsBy qw/ nsort_by /;

my @sorted_keys = nsort_by { $data{$_} } keys %data;

for my $key ( (reverse @sorted_keys)[0..2] ) {
  print "$key $data{$key}\n";
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您喜欢在不同的地方反向

use List::UtilsBy qw/ rev_nsort_by /;

my @sorted_keys = rev_nsort_by { $data{$_} } keys %data;

for my $key ( @sorted_keys[0..2] ) {
  print "$key $data{$key}\n";
}
Run Code Online (Sandbox Code Playgroud)

观察到模块的之间的差别sort_bynsort_by等同于之间的差cmp<=>分别比较运算符.

这两种替代方案都产生与上述原始输出相同的输出