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

问题描述 投票:0回答:1

我具有以下结构的存储的多维哈希(%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);
    }
}

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

有帮助吗?

perl sorting hash
1个回答
0
投票

有时最困难的事情就是准确地定义问题。尝试以下代码:

#!/usr/bin/perl
use warnings;
use strict;
use integer;

my %info = (
    Debian  => { jessie => 80, buster => 90, bullseye => 110 },
    Fedora  => { fedora_a => 70, fedora_b => 105 },
    Arch    => { arch_a => 50, arch_b => 108 },
    Windows => { vista => 40, win10 => 63 },
    OSX     => { apple => 71 },
);

my @key_pairs_unsorted;
for my $os (keys %info) {
    for my $id (keys %{$info{$os}}) {
        push @key_pairs_unsorted, {os => $os, id => $id};
    }
}
my @key_pairs_sorted =
  sort { $info{$b->{os}}{$b->{id}} <=> $info{$a->{os}}{$a->{id}} }
  @key_pairs_unsorted;

printf "%-7s %-8s %3d\n",
  $_->{os}, $_->{id}, ${info}{$_->{os}}{$_->{id}}
  for @key_pairs_sorted;

理解此代码应该可以帮助您精确地定义问题,然后您应该能够迅速地解决问题。

[作为进一步参考,可能需要关注this questionthis one


0
投票
my($maxos,$maxid,$maxlength);
foreach my $os (sort keys %info) {
  foreach my $id (keys %{ $info{$os} }) {
    ($maxos,$maxid,$maxlength) = ($os,$id,$info{$os}{$id})
      if !defined $maxlength || $info{$os}{$id} > $maxlength;
  }
}

print "$maxos $maxid => $maxlength\n";
© www.soinside.com 2019 - 2024. All rights reserved.