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

时间:2015-03-23 20:24:57

标签: perl hash

我们说我在哈希中存储了以下信息:

kiwi  15
oranges 25
cherries 30
apples 2
pears 1

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

cherries 30
oranges 25
kiwi 15

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

1 个答案:

答案 0 :(得分: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";
}

<强>输出

cherries 30
oranges 25
kiwi 15

<强>更新

对于更通用的解决方案,(非核心)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";
}

或者,如果你喜欢在另一个地方反向

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";
}

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

这两种选择都产生与上述原始相同的输出