按值排序散列哈希值

时间:2013-04-22 02:43:46

标签: arrays perl hash-of-hashes

我有以下数据结构

my %HoH = {
      'foo1' => {
                        'bam' => 1,
                        'zip' => 0,
                      },
      'foo2' => {
                         'bam' => 0,
                         'zip' => 1,
                         'boo' => 1
                       }
    };

我想按存储在'zip'中的VALUE按从最大到最小的顺序对KEY1(foo1或foo2)进行排序。

以下是我的表现方式。

use strict; use warnings;
use Data::Dumper;
my @sorted;
foreach my $KEY1 (keys %HoH) {
    # sort KEY1 by the value 'zip' maps to in descending order
    @sorted = sort {$HoH{$KEY1}{'zip'}{$b} <=> 
        $HoH{$KEY1}{'zip'}{$a}} keys %HoH;
}

print Dumper(\@sorted);

我收到了一个奇怪的警告:参考文献找到了test.pl第6行的预期大小列表。 此外print Dumper(\@sorted);正在打印

$VAR1 = [
      'HASH(0x1b542a8)'
    ];

应该打印时

$VAR1 = [
      ['foo2', 'foo1']
    ];

由于foo2有1 zipfoo1有0 zip

1 个答案:

答案 0 :(得分:6)

  • %HoH被声明为哈希,但被定义为哈希引用。使用括号(...)代替大括号{...}
  • 您不需要遍历哈希来对其进行排序。排序将照顾到这一点。
  • 如果您sort {...} keys %HoH,则特殊变量$a$b代表%HoH执行排序时的键。
  • $a$b的顺序相反,因为您的预期结果是递减顺序。 (更新:哦,我刚刚注意到你首先有这个。)
  • 嵌套哈希中的zip值为$HoH{$KEY}{'zip'},这是您应该排序的。

    use strict;
    use warnings;
    use Data::Dumper;
    
    my %HoH = (
          'foo1' => {
                            'bam' => 1,
                            'zip' => 0,
                          },
          'foo2' => {
                             'bam' => 0,
                             'zip' => 1,
                             'boo' => 1
                           }
        );
    
    my @sorted = sort {$HoH{$b}{'zip'} <=> $HoH{$a}{'zip'}} keys %HoH;
    print Dumper \@sorted;
    

请注意,此代码的结果将为您提供一个数组:

$VAR1 = [
      'foo2',
      'foo1'
];

...不是嵌套数组:

$VAR1 = [
     ['foo2', 'foo1']
];