访问哈希散列数组中的元素(Perl)

时间:2013-10-23 12:03:36

标签: arrays perl hashtable

我已使用哈希值哈希填充数组@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 },
          },
        ];

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

该数组包含对哈希的引用。你需要取消引用它们:

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

有关参考文献的更多信息,请参阅man perlref

答案 1 :(得分:1)

您的代码确实有效。这是我的代码,适用于虚拟阵列。 我想你的问题是你没有测试你的数组元素是否实际是散列引用的散列引用。例如,如果$a[2]'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