4

ハッシュの配列を作成しようとしていますが、配列のループ処理に問題があります。このコードを試しましたが、うまくいきません:

for  ($i = 0; $i<@pattern; $i++){
  while(($k, $v)= each $pattern[$i]){
    debug(" $k: $v");
  }
}
4

3 に答える 3

24

まず、なぜuseingstrictと をしないのですwarningsか? 次の行は、作成するすべての Perl プログラムの先頭、 の直後にある必要があります#!/usr/bin/perlいつも

use strict;
use warnings;

strictそして、変数の使用から判断すると、これから、およびwarningsコード内の他の多くの場所からも、適切なエラーメッセージが表示されると確信しているため、そうではないことはわかっています。

第二に、なぜこれをしないのですか:

for my $i (@pattern) {
  ..
}

これは のすべての要素をループして、一度@patternに 1 つずつ割り当てます$i。次に、ループ内で特定の要素が必要な場合は、 を使用します$i。への変更$iは に反映され@pattern、ループが終了$iするとスコープから外れ、基本的にそれ自体の後でクリーンアップされます。

第三に、Larry Wall の愛のために、変数を で宣言してローカライズしてくださいmyそれは本当に難しいことではなく、あなたをより良い人間にしてくれると約束します.

最後に、配列はハッシュではなくハッシュへの参照を格納します。ハッシュを保存した場合、ハッシュは%ではなくで始まるため、コードは間違っています$。そのままでは、(あらゆる種類の) 参照はスカラー値であるため、 で始まり$ます。したがって、ハッシュを取得するには、それらを逆参照する必要があります。

for my $i (@pattern) {
  while(my($k, $v) = each %{$i}) {
    debug(" $k: $v");
  }
}

または、あなたの方法:

for  (my $i = 0; $i<@pattern; $i++) { # added a my() for good measure
  while(my($k, $v) = each %{$pattern[$i]}) {
    debug(" $k: $v");
  }
}
于 2009-08-24T07:29:35.230 に答える
6

代わりにこれを試してください:

for my $hashref (@pattern) {
    for my $key (keys %$hashref) {
        debug "$key: $hashref->{$key}";
    }
}

あなたがしようとしていたことの最大の問題はeach $pattern[$i]. each関数は、ハッシュが機能することを期待し$pattern[$i]ますが、ハッシュ参照 (つまり、ハッシュへの参照) を返します。$pattern[$i]ハッシュとして逆参照することでコードを修正できます。

while(my($k, $v) = each %{$pattern[$i]}) {

また、各関数に注意してください。ハッシュ反復子が不完全な状態のままになる可能性があります。

于 2009-08-24T07:29:24.213 に答える
4

perl データ構造クックブックのドキュメントを参照してください。 perldoc perldsc

于 2009-08-24T10:15:10.713 に答える