如何迭代哈希数组中的哈希数组

时间:2012-09-11 13:23:05

标签: arrays perl hash

关于迭代哈希数组的大量线程,我每天都这样做。但是现在我想迭代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

4 个答案:

答案 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'}的值,这是一个数字但不起作用。