查找与特定键匹配的嵌套哈希值

时间:2017-03-11 18:54:45

标签: perl hash hashmap

我在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哈希?

3 个答案:

答案 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}};