我在perl中创建了哈希哈希,这是哈希最终看起来像的例子:
my %grades;
$grades{"Foo Bar"}{Mathematics} = 97;
$grades{"Foo Bar"}{Literature} = 67;
$grades{"Peti Bar"}{Literature} = 88;
$grades{"Peti Bar"}{Mathematics} = 82;
$grades{"Peti Bar"}{Art} = 99;
并打印整个哈希,我正在使用:
foreach my $name (sort keys %grades) {
foreach my $subject (keys %{ $grades{$name} }) {
print "$name, $subject: $grades{$name}{$subject}\n";
}
}
我需要打印内部哈希引用“Peti Bar”并找到最高值,所以从理论上讲,我应该通过Peti Bar,Literature; Peti Bar,数学;和Peti Bar,Art并最终回归Art,因为它具有最高的价值。 有没有办法做到这一点,还是我需要解析整个2d哈希?
答案 0 :(得分:2)
如果您知道自己感兴趣的密钥,则无需解析第一级。只需省略第一个循环并直接访问它。要获得最高价值,您必须先查看每个主题。
跟踪最高值及其附带的键,然后打印。
my $max_value = 0;
my $max_key;
foreach my $subject (keys %{ $grades{'Peti Bar'} }) {
if ($grades{'Peti Bar'}{$subject} > $max_value){
$max_value = $grades{'Peti Bar'}{$subject};
$max_key = $subject;
}
}
print $max_key;
这将输出
Art
使用sort
的替代实现如下所示:
print +(
sort { $grades{'Peti Bar'}{$b} <=> $grades{'Peti Bar'}{$a} }
keys %{ $grades{'Peti Bar'} }
)[0];
+
中的+( ... )
告诉Perl括号()
不是用于调用print
的函数,而是用于构造列表。 sort
对键进行排序,降序,因为它首先有$b
。它返回一个列表,我们取第一个值(索引0
)。
请注意,这比第一次实现更昂贵,并不一定更简洁。除非您正在构建单行或; ,否则我不推荐第二种解决方案。
答案 1 :(得分:2)
使用List::UtilsBy
模块
通过提取对我们感兴趣的内部哈希的引用来使代码更清晰。调用max_by
以返回具有最大值的哈希的键
use strict;
use warnings 'all';
use feature 'say';
use List::UtilsBy 'max_by';
my %grades = (
'Foo Bar' => { Literature => 67, Mathematics => 97 },
'Peti Bar' => { Literature => 88, Mathematics => 82, Art => 99 },
);
my $pb_grades = $grades{'Peti Bar'};
say max_by { $pb_grades->{$_} } keys %$pb_grades;
Art
答案 2 :(得分:0)
作为Perl初学者,我会使用List::Util核心模块:
use 5.014;
use List::Util 'reduce';
my $k='Peti Bar';
say reduce { $grades{$k}{$a} > $grades{$k}{$b} ? $a : $b } keys %{$grades{$k}};