1

配列@aにハッシュのハッシュを設定したので、次のようになります。

$a[0]{'keyA'}{'keyB'}

私に価値を与えます。

配列内の要素 (たとえば index 0) を選択し、ハッシュ内のすべての要素を次のようにアルファベット順にループしたいと思います。

for my $keyA (sort keys $a[0]) {
    for my $keyB (sort keys $a[0]{$keyA}) {
        print $a[0]{$keyA}{$keyB};
    }
}

理由はわかりませんが、Perl はループを完全にスキップします。これは、Eclipse デバッガーを使用してステップ実行するときに確認できます。

私の配列の data::dump:

$VAR1 = [
          {},
          {
            'Z' => { 'Z' => 1 },
            'G' => { ''  => 1 },
          },
          undef,
          {
            'A' => { 'A03' => 1, 'A02' => 1 },
            'G' => { 'G29' => 3 },
            'Z' => { 'Z' => 1 },
            'F' => { 'F24' => 2, 'F27' => 1 },
          },
          {
            'A' => { 'A02' => 2 },
            'O' => { 'O62' => 1 },
            'B' => { 'B05' => 1 },
          },
        ];

どんな助けでも大歓迎です。

4

2 に答える 2

2

配列には、ハッシュへの参照が含まれています。それらを逆参照する必要があります。

for my $keyA (sort keys %{ $a[0] })
   for my $keyB (sort keys %{ $a[0]{$keyA} }) {

参照の詳細については、man perlref

于 2013-10-23T12:11:57.870 に答える
1

あなたのコードは実際に動作します。これは、ダミー配列で動作する私のコードです。あなたの問題は、配列要素が実際にハッシュ参照のハッシュ参照であるかどうかをテストしなかったことだと思います。たとえば、$a[2]is'foo'の場合、コードが壊れます。この場合、各要素と要素の各ハッシュ値をテストする必要があります。例えば、if (ref $array[0] eq 'HASH'){...}

my @array = ({'a'=>{'aa'=>11, 'bb'=>12, 'cc'=>13},
              'b'=>{'aaa'=>21 , 'bbb'=>22, 'ddd'=>23},
              'c'=>{'aaaa'=>31, 'bbbb'=>32 , 'cccc'=>33},
            });

for my $keyA (sort keys $array[0]) {
    for my $keyB (sort keys $array[0]{$keyA}) {
        print $array[0]{$keyA}{$keyB},"\n";
    }
}

出力:

11
12
13
21
22
23
31
32
33
于 2013-10-23T13:18:29.400 に答える