假设我在哈希中存储了以下信息:
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)
我似乎无法找到明确的答案.
这会像你问的那样做.它使用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_by和nsort_by等同于之间的差cmp和<=>分别比较运算符.
这两种替代方案都产生与上述原始输出相同的输出