关于迭代哈希数组的大量线程,我每天都这样做。但是现在我想迭代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 :(得分:6)
use warnings;
use strict;
foreach my $criterion (@$criteria) {
foreach my $chapter (@{$criterion->{chapters}}) {
print $chapter->{title}, "\n";
}
}
答案 1 :(得分:2)
我同意perreal,但要更狭隘地回答你的问题 - 你的代码应该没问题,除了当$#$arrayref
不再是变量时使用$arrayref
符号,你使用大括号{}
,以便Perl可以告诉引用的范围:
for my $j ( 0 .. $#{$criteria->[$i]{'chapters'}}) {
(即使$arrayref
是变量,您也可以使用大括号来显式:
for my $i ( 0 .. $#{$criteria} ) {
。这同样适用于其他解除引用方式:@$arrayref
或@{$arrayref}
,%$hashref
或%{$hashref}
,等等。)
答案 2 :(得分: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} };
答案 3 :(得分: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'}
,因为$#
部分仅在第一个->
之前有效,所以它会尝试<{1}}超出->[$i]{'chapters'}
的值,这是一个数字但不起作用。