我在 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,因为它具有最高的值(value)。 有没有办法做到这一点,或者我是否需要解析整个 2d 哈希?
最佳答案
如果您知道您感兴趣的 key ,则无需解析第一级。只需省略第一个循环并直接访问它。要获得最高值(value),您必须对每个主题都看一遍。
跟踪最高值和与之对应的键,然后打印。
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
)。
请注意,这比第一个实现更昂贵,而且不一定更简洁。除非你正在构建一个单行或你的 ; 坏了我不会推荐第二种解决方案。
关于perl - 查找与特定键匹配的嵌套哈希值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42739255/