Perl 配列に特定の値が含まれているかどうかを確認するにはどうすればよいですか? 質問する

Perl 配列に特定の値が含まれているかどうかを確認するにはどうすればよいですか? 質問する

配列を反復処理せずに、配列内の値の存在を確認する方法を見つけようとしています。

パラメータのファイルを読み取っています。処理したくないパラメータの長いリストがあります。これらの不要なパラメータを配列に配置しました@badparams

新しいパラメータを読み取り、それが に存在しない場合は@badparams処理します。 に存在する場合は@badparams、次の読み取りに進みます。

ベストアンサー1

最適な汎用性 - 特に短い配列 (1000 項目以下) や、自分のニーズに最適な最適化がわからないコーダーに最適です。

# $value can be any regex. be safe
if ( grep( /^$value$/, @array ) ) {
  print "found it";
}

grep は、配列の最初の値が一致しても、すべての値を渡すと説明しました。これは事実ですが、それでもgrep はほとんどの場合非常に高速です。短い配列 (1000 項目未満) の場合、ほとんどのアルゴリズムはとにかくかなり高速になります。非常に長い配列 (1,000,000 項目) の場合、項目が配列の最初か真ん中か最後かに関係なく、grep は十分に高速です。

長い配列の最適化のケース:

配列がソートされている場合は、「バイナリ検索」を使用します。

同じ配列が何度も繰り返し検索される場合は、まずそれをハッシュにコピーしてからハッシュをチェックします。メモリが問題になる場合は、配列の各項目をハッシュに移動します。メモリ効率は高くなりますが、元の配列は破壊されます。

配列内で同じ値が繰り返し検索される場合は、遅延キャッシュを構築します。(各項目が検索されるたびに、まず検索結果が永続ハッシュに格納されているかどうかを確認します。ハッシュ内に検索結果が見つからない場合は、配列を検索して結果を永続ハッシュに格納します。これにより、次回はハッシュ内で検索結果が見つかり、検索がスキップされます)。

注意: これらの最適化は長い配列を扱う場合にのみ高速化されます。 過度に最適化しないでください。

おすすめ記事