0

次のネストされたループについて考えてみます。

my %deleted_documents_names = map { $_ => 1 }
                $self->{MANUAL}->get_deleted_documents();

while($sth->fetch){
  .....
  .....
  .....
  while(my ($key, $value) = each(%deleted_documents_names)){
        {
         if($document_name eq $key){
              $del_status=1;
              last;
         }
        }
  if($del_status==1){next;} 
  .....
  .....
  .....
  .....
}

ここで、3つの値(A、B、C)が2つの値(B、C)と比較されるサンプルケースを取り上げます。

First scan:
A compared to B
A compared to C

Second scan:
B compared to B 
Loop is terminated.

Third scan:
C is compared with C.

この場合、Cは最初にBと比較され、最初の値になりますが、この比較はスキップされ、等しいことが判明した要素の次の要素からのみスキャンされます。最後の終了条件を削除し、スキャンの総数に対してループを実行すると、すべて正常に機能しますが、この場合、$ keyがループの最初の値ではなく、次に比較される値を参照する理由を確認する必要があります最後のキーワードで終了した後に再起動されます。

どんな助けでもありがたいです。

4

2 に答える 2

4

使用する

keys %deleted_documents_names ; # Reset the "each" iterator.

キーを参照してください。

しかし、なぜハッシュを反復処理しているのですか? なぜあなたはちょうど

if (exists $deleted_documents_names{$document_name}) {
于 2013-02-21T10:51:05.357 に答える
4

each()最後までハッシュからキーと値のペアを返す関数です。呼び出されたスコープを認識しておらず、while ループ ロジックについても何も認識していません。こちらのドキュメントを参照してください

keys %hashまたはを呼び出してリセットできますvalues %hash

更新:ただし、Choroba が指摘しているように、このループは実際には必要ありません。ループと付随するロジックは、次のように置き換えることができます。

next if (exists $deleted_documents_names{$document_name});

(ハッシュは、キーをすばやく見つけることができる構造で設計されています。実際、この構造はハッシュに「ハッシュ」という名前を付けたものです。したがって、このようにすることは、すべての要素をループしてそれぞれをテストするよりもはるかに効率的です。 )。

于 2013-02-21T10:53:41.093 に答える