【问题标题】:Accessing elements in an array of hashes of hashes (Perl)访问哈希数组中的元素(Perl)
【发布时间】:2013-11-01 16:44:23
【问题描述】:

我已经用哈希值填充了数组@a,因此:

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

给我一​​个价值。

我现在想在数组中选择一个元素(比如索引0)并按字母顺序遍历散列中的所有元素,如下所示:

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

我不知道为什么,但 Perl 完全跳过了循环。我可以在使用 Eclipse 调试器单步执行时看到这一点。

我的数组的数据::转储:

$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 },
          },
        ];

任何帮助将不胜感激。

【问题讨论】:

  • 你永远不应该说“Perl 似乎不喜欢..”之类的话。您应该复制/粘贴错误。
  • use Data::Dumper; print Dumper \@a; 的输出是什么?这将向我们展示您正在谈论的数据结构。

标签: arrays perl hashtable


【解决方案1】:

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

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

更多参考资料请见man perlref

【讨论】:

  • 定义“不起作用”。您究竟看到了什么意外行为?
  • 您是否也取消了对内部循环的引用?
  • 没有给出错误,似乎完全跳过了循环。当我使用 Eclipse 调试器运行它时,我可以看到这一点。即解释器永远不会进入循环
  • 查看添加到您的问题的转储,$a[0] 是对空哈希的引用
【解决方案2】:

您的代码确实有效。这是我在虚拟数组上工作的代码。 我想您的问题是您没有测试您的数组元素是否实际上是哈希引用的哈希引用。例如,如果$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

【讨论】:

  • 它不适用于我的代码。也许它是我初始化数组的方式。我使用:@a = ({});然后通过循环并分别输入每个元素来填充它,例如: $a[0]{'a'}{'aa'} = 68;
  • @Josh 如果@a 只有一个元素,也许你不需要数组?
  • 数组最后会有多个元素
猜你喜欢
  • 2021-08-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-20
  • 1970-01-01
  • 2016-12-12
  • 1970-01-01
  • 2015-06-26
  • 2016-05-19
相关资源
最近更新 更多