2

我有以下数据结构

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

我想按存储在“zip”中的值从大到小对 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有 1zip并且foo1有 0 zip

4

1 回答 1

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']
];
于 2013-04-22T02:53:57.893 回答