広告
広告
次に変更される前に何回も文字列に対するパターンマッチを行なうアプリケーションで、そのような文字列 SCALAR (省略時には $_) を予め学習しておきます。これは検索のためにどのようなパターンを何回使うかによって、また検索される文字列内の文字頻度の分布によって時間を節約することになるかもしれないし逆に浪費することになるかもしれません。予習をした場合としない場合の実行時間を比較して、どちらが速いか調べることが必要となります。短い固定文字列をたくさん検索するループでもっとも効果があるでしょう。一つの時点では一つの study だけが有効となります。別のスカラを study した場合には以前に学習した内容は「忘却」されてしまいます。実行時まで探そうとする文字列がわからないときにはループ全体を文字列として組み立ててeval すればいつもすべてのパターンを再コンパイルするという事態は避けられます。ファイル全体を一つのレコードとして入力するために$/ を未定義とすればかなり速くなり、多くの場合 fgrep のような専用のプログラムより速くなります。
$search = 'while (<>) { study;'; foreach $word (@words) { $search .= "++\$seen{\$ARGV} if /\\b$word\\b/;\n"; } $search .= "}"; @ARGV = @files; undef $/; eval $search; $/ = "\n"; foreach $file (sort keys(%seen)) { print $file, "\n"; }
広告