我正在尝试迭代这个数据结构:
$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";
}
我完全在挖掘数据结构,但这个结构让我感到难过。有什么建议可能是错的吗?
答案 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}
答案 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
键之外的部分,因此问题看起来并不那么难。