迭代数据结构

时间:2011-08-29 14:32:22

标签: perl data-structures iterator complex-data-types

我正在尝试迭代这个数据结构:

$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[0]->{code}

fact[0]正在增加。这是我正在处理的几个文件,因此{facts}[x]的数量会有所不同。

我认为这可能有用,但它似乎没有加强$iter var:

foreach $iter(@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){
  print $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n";
}

我完全在挖掘数据结构,但这个结构让我感到难过。有什么建议可能是错的吗?

5 个答案:

答案 0 :(得分:4)

$ iter被设置为数组中每个项目的内容而不是索引。 e.g。

my $a = [ 'a', 'b', 'c' ];
for my $i (@$a) {
    print "$i\n";
}

...打印:

a
b
c

尝试:

foreach $iter (@{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}}){
    print $iter->{code}."\n";
}

答案 1 :(得分:3)

$iter不会是您可以下标数组的索引,而是数组的当前元素。所以我想你应该没问题:

$iter->{code}

答案 2 :(得分:3)

您的$ iter包含数据结构。你基本上想要的是:

foreach my $elem ( @{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}} ){
    print $elem->{code};
}

或:

foreach my $iter ( 0 .. scalar @{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}} ){
    print $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n";
}

答案 3 :(得分:2)

由于您循环遍历数组,因此您的错误名称$iter是您要查找的值,而不是索引。 如果您想要遍历索引,请执行以下操作:

foreach $iter ( 0 .. $#{$deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}} ) {
    print "Index $iter: ",
        $deconstructed->{data}->{workspaces}[0]->{workspace}->{facts}[$iter]->{code}."\n";
}

另请注意,您可以将->放在两个[]{}之间:

$deconstructed->{data}{workspaces}[0]{workspace}{facts}[$iter]{code}

我建议阅读http://perlmonks.org/?node=References+quick+reference

答案 4 :(得分:0)

当你有这样丑陋的数据结构时,为它创建一个界面,这样你的生活就会更轻松:

 foreach my $fact ( $data_obj->facts ) {  # make some lightweight class for this
     ....;
     }

即使不这样做,也可以考虑使用对所需数据结构部分的引用,这样就不会考虑其余部分:

 my $facts = $deconstructed->{data}{workspaces}[0]{workspace}{facts};
 foreach my $fact ( @$facts ) {
     print "Thing is $fact->{code}\n";
     }

这只是一个参考,所以你不会重新创造任何东西。由于您只需要考虑facts键之外的部分,因此问题看起来并不那么难。