Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 访问哈希数组中的元素(Perl)_Arrays_Perl_Hashtable - Fatal编程技术网

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

Arrays 访问哈希数组中的元素(Perl),arrays,perl,hashtable,Arrays,Perl,Hashtable,我已使用哈希值填充数组@a,以便: $a[0]{'keyA'}{'keyB'} 给我一个价值 现在,我想在数组中选择一个元素(比如index0),并按字母顺序遍历散列中的所有元素,如下所示: for my $keyA (sort keys $a[0]) { for my $keyB (sort keys $a[0]{$keyA}) { print $a[0]{$keyA}{$keyB}; } } 我不知道为什么,但是Perl完全跳过了这个循环。在使用Eclip

我已使用哈希值填充数组
@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调试器时,我可以看到这一点

我的阵列的数据::转储:

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

任何帮助都将不胜感激。

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

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

有关引用的更多信息,请参见您的代码实际运行情况。这是我在虚拟数组上工作的代码。 我想您的问题在于,您没有测试数组元素是否实际上是哈希引用的哈希引用。例如,如果
$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

永远不要说“Perl似乎不喜欢…”之类的话。您应该复制/粘贴错误。
use Data::Dumper的输出是什么;打印转储程序\@a?这将向我们展示您正在谈论的数据结构。定义“不工作”。您到底看到了什么意外行为?您是否也取消了对内部循环的引用?没有给出任何错误-它似乎完全跳过了循环。我可以在使用Eclipse调试器运行它时看到这一点。i、 e.解释器从不进入循环查看添加到您的问题中的转储,
$a[0]
是对空哈希的引用,它不适用于我的代码。也许这就是我初始化数组的方式。我使用:@a=({});然后通过循环并分别输入每个元素来填充它,比如:$a[0]{'a'}{'aa'}=68@Josh如果
@a
只有一个元素,那么您可能不需要数组?数组最终将有多个元素