按值对多维散列进行排序并显示最高的

Emi*_*hez 4 sorting perl hash

我具有%info以下结构的存储的多维哈希():

$info{$os}{$id}=$length;

foreach $os (keys %info){   
    foreach $id (keys %{$info{$os}}){
        print "$os $id => " . $info{$os}{$id} ."\n" if (keys %info > 100);
    }
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以读取哈希并仅打印$os出现次数超过100 的哈希值,但是现在我只想打印$id具有最高$ length(即值)的值。因此,我想按值对散列进行排序并仅打印$os$id具有最高值。

有什么帮助吗?

zdi*_*dim 5

可以使用List :: Util :: reduce在每个顶级密钥中获取具有最大值的密钥

use List::Util qw(reduce);

for my $os (keys %info) { 
    my $id_max_length = reduce { 
        $info{$os}{$a} > $info{$os}{$b} ? $a : $b 
    } keys %{$info{$os}};

    say "$os --> $id_max_length --> $info{$os}{$id_max_length}";
}
Run Code Online (Sandbox Code Playgroud)

在所有按键中获得最高价值

my ($max_os, $max_id) = 
    map { $_->[0], $_->[1] }
    reduce { $info{$a->[0]}{$a->[1]} > $info{$b->[0]}{$b->[1]} ? $a : $b }
    map { [$_, max_id_for_os($_)] } 
    keys %info;

say "$max_os -> $max_id -> $info{$max_os}{$max_id}";

sub max_id_for_os {
    my ($os) = @_; 
    reduce { $info{$os}{$a} > $info{$os}{$b} ? $a : $b } keys %{$info{$os}}
}
Run Code Online (Sandbox Code Playgroud)

或者,也许更简单,在循环中对顶级键进行比较

my ($max_os, $max_id) = do {  # initialize
    my ($os) = keys %info;
    $os, (keys %{$info{$os}})[0];
};

for my $os (keys %info) { 
    my $mid = 
        reduce { $info{$os}{$a} > $info{$os}{$b} ? $a : $b } 
        keys %{$info{$os}};

    ($max_os, $max_id) = ($os, $mid) 
        if $info{$os}{$mid} > $info{$max_os}{$max_id};
}

say "Largest: $max_os -> $max_id -> $info{$max_os}{$max_id}";
Run Code Online (Sandbox Code Playgroud)