2

私は次のデータ構造を持っています

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

KEY1 (foo1 または foo2) を 'zip' に保存されている VALUE で最大から最小の順に並べ替えたいと思います。

これが私がやっている方法です。

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);

奇妙な警告が表示されます: Reference found where even-sized list expected at test.pl line 6. またprint Dumper(\@sorted);、印刷しています

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

いつ印刷すべきか

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

foo2は 1zipであり、0foo1です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 に答える