ハッシュの配列を作成しようとしていますが、配列のループ処理に問題があります。このコードを試しましたが、うまくいきません:
for ($i = 0; $i<@pattern; $i++){
while(($k, $v)= each $pattern[$i]){
debug(" $k: $v");
}
}
ハッシュの配列を作成しようとしていますが、配列のループ処理に問題があります。このコードを試しましたが、うまくいきません:
for ($i = 0; $i<@pattern; $i++){
while(($k, $v)= each $pattern[$i]){
debug(" $k: $v");
}
}
まず、なぜuse
ingstrict
と をしないのです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");
}
}
代わりにこれを試してください:
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]}) {
また、各関数に注意してください。ハッシュ反復子が不完全な状態のままになる可能性があります。
perl データ構造クックブックのドキュメントを参照してください。
perldoc perldsc