2

ハッシュの配列を反復処理することについてのスレッドがたくさんあります。これは私が毎日行っています。ただし、AoHinと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

4 に答える 4

6
use warnings;
use strict;

foreach my $criterion (@$criteria) {
  foreach my $chapter (@{$criterion->{chapters}}) {
    print $chapter->{title}, "\n";
  }
}
于 2012-09-11T13:28:30.393 に答える
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} };
于 2012-09-11T13:36:34.830 に答える
2

私はperrealに同意しますが、質問にもう少し狭く答えるには、コードは問題ないはずです。ただし、が変数でなくなった$#$arrayrefときに表記を使用するには、中かっこを使用して、Perlが参照の範囲を認識できるようにします。$arrayref{}

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

$arrayref 変数の場合でも、中括弧を使用して明示的にすることができます。

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

。また、同じことが他の間接参照方法にも当てはまります:@$arrayrefまたは@{$arrayref}、、、%$hashrefなど%{$hashref}。)

于 2012-09-11T13:30:06.243 に答える
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

于 2012-09-11T13:33:46.037 に答える