2012-09-11 175 views
2

大量关于迭代散列数组的线程,我每天都会做。但是现在我想要遍历AoH和AoH。我感兴趣的数组“章”,因为我想一个散列添加到内部阵列中的每个数组元素:如何遍历散列数组中的散列数组

$criteria = [ 
    { 
     'title' => 'Focus on Learning', 
     'chapters' => [ 
          { 
          'content_id' => '182', 
          'criteria_id' => '1', 
          'title' => 'Focus on Learning', 
          }, 
          { 
          'content_id' => '185', 
          'criteria_id' => '1', 
          'title' => 'Teachers Role', 
          }, 
          { 
          'content_id' => '184', 
          'criteria_id' => '1', 
          'title' => 'Parents in Class', 
          }, 
          { 
          'content_id' => '183', 
          'criteria_id' => '1', 
          'title' => 'Students at Home', 
          } 
         ], 
     'tot_chaps' => '4' 
    }, 

这在理论上,是要我想做的事情。

for my $i (0 .. $#$criteria) { 
    for my $j (0 .. $#$criteria->[$i]{'chapters'}) { 
     print $criteria->[$i]{'chapters'}->[$j]{'title'}."\n"; 
    } 
} 

print $criteria->[$i]{'chapters'}->[1]{'title'}."\n"; -> Teachers Role 

回答

0

如果你想添加的东西,就去做。我不确定我是否明白你想要添加什么。如果你想为每个章节的另一个键/值对,像这样做:

for my $i (0 .. $#$criteria) { 
    for my $j (0 .. $#{$criteria->[$i]{'chapters'}}) { 
    $criteria->[$i]{'chapters'}->[$j]->{'Teachers Role'} = 'Stuff'; 
    } 
} 

而且,在代码中的小错误:使用$#{$criteria->[$i]{'chapters'}}代替$#$criteria->[$i]{'chapters'}因为$#部分只直到第一个->,所以它试图访问->[$i]{'chapters'}$#$criteria这是一个数字,并不起作用的价值。

+0

感谢关于如何添加散列的“增值”答案。 – breadwild

+0

我很高兴你喜欢它。我不确定你的问题是什么,看起来其他人提供的解释并不是你想要的。 – simbabque

+0

哎呀,我注意到,虽然“添加”部分工作,但直到我申请由ruakh – breadwild

6
use warnings; 
use strict; 

foreach my $criterion (@$criteria) { 
    foreach my $chapter (@{$criterion->{chapters}}) { 
    print $chapter->{title}, "\n"; 
    } 
} 
+0

这个工作以及ruakh的 – breadwild

2

我同意perreal,但要回答你的问题有点更窄—你的代码要细,不同之处在于使用$#$arrayref符号时$arrayref不再是一个变量,可以使用卷曲括号{}使Perl可以告诉参考的程度:

for my $j (0 .. $#{$criteria->[$i]{'chapters'}}) { 

(即使$arrayref一个变量,你可以使用铜明确括号括起来:

for my $i (0 .. $#{$criteria}) { 

。这同样适用于非关联的其他方式:@$arrayref@{$arrayref}%$hashref%{$hashref},等等)

+0

大点。我会尝试这个和perreal。 – breadwild

+0

http://www.perlmonks.org/?node=References+quick+reference很好地总结了规则。 – ysth

+0

这工作以及perreal的 – breadwild

2

像这样遍历数据结构通常更容易,而不是获取所有级别的标记(就像您的代码所做的那样)。这可以让你自己来处理每个级别:

for my $criterion (@$criteria) { 
    print "$criterion->{title}\n"; 
    for my $chapter (@{ $criterion->{chapters} }) { 
     print "\t$chapter->{title}\n"; 
    } 
} 

作为一个侧面说明,tot_chaps关键是危险的,如果这不是一个只读的数据结构。这是很容易为它不同步与$criterion->{chapters}和复制已经存储在阵列中的信息:

my $total_chapters = @{ $criterion->{chapters} };