Perl排序不规则嵌套哈希

时间:2015-06-24 13:57:36

标签: perl sorting hash

我有一个不规则的哈希(我不知道如何标记它)

my %hash = (
      'BlackBerryOS' => {
                          '6.0' => 9201,
                          '7' => 5896,
                          '10' => 9140,
                          '4.1' => 5395,
                          '4.6' => 6536
                        },
      'iOS' => {
                 '8' => 9327,
                 '3.0' => 4112,
                 '5.0' => 8579,
                 '4.0' => 14953,
                 '6.0' => 12007,
                 '7.0' => 13162
               },
      'AndroidOS' => {
                       '4.2' => 167501,
                       '2.3.4' => 7889,
                       'x' => 473602,
                       '4.3' => 44551,
                       '4.1.2' => 90984
                     }
    );

我想根据最深层次的值对此哈希进行排序。 我将如何进行排序和打印以达到类似的效果?

AndroidOS      x     473602
AndroidOS      4.2   167501
AndroidOS      4.1.2 90984
AndroidOS      4.3   44551
iOS            4.0   14953
iOS            7.0   13162
iOS            6.0   12007
iOS            8     9327
BlackBerryOS   6.0   9201
BlackBerryOS   10    9140
iOS            5.0   8579
AndroidOS      2.3.4 7889
BlackBerryOS   4.6   6536
BlackBerryOS   7     5896
BlackBerryOS   4.1   5395
iOS            3.0   4112

1 个答案:

答案 0 :(得分:2)

哈希是无序的,因此您必须首先将其转换为有序结构(例如数组):

my @data;
for my $os (keys %hash) {
    for my $version (keys %{$hash{$os}}) {
        push @data, { os => $os, version => $version, n => $hash{$os}->{$version} };
    }
}

然后,排序很简单:

@data = sort { $b->{n} <=> $a->{n} } @data;

正如报道:

for (@data) {
    print "$_->{os}\t$_->{version}\t$_->{n}\n";
}