m//g
が終了した場所のオフセットを返し
ます。そのオフセットを変えるために、変更することができます。
continue
ブロックで使われます。expr は、文字を
並べたもの (範囲を指定するのに、ハイフンが使えます) と解釈されます。名前
がその文字のいずれかで始まる変数や配列は、最初の状態にリセットされます。
expr を省略すると、1回検索(?PATTERN?
) を再びマッチするよう
にリセットできます。カレントパッケージの変数もしくは検索だけがリセットさ
れます。常に 1 を返します。例:
reset 'X'; # すべての X 変数をリセット reset 'a-z'; # 小文字変数をリセット reset; # ?? 検索だけをリセット
reset "A-Z"
とすると、argv や env といった配列もなく
なってしまいますから、止めた方が良いでしょう。パッケージ変数だけがリセッ
トされます。字句変数は、影響を受けませんが、スコープから外れれば、自動的
に綺麗になりますので、これからは、こちらを使うようにした方がよいでしょう。
このドキュメントの my
の項を参照してください。
index
と同じように動作します。position を指定すると、その位
置より前の、最後の位置を返します。
study
だ
けが有効です。別のスカラを study
した場合には、以前に学習した内容
は「忘却」されてしまいます。(この study
の仕組みは、まず、検索さ
れる文字列内のすべての文字のリンクされたリストが作られ、たとえば、すべて
の 'k' がどこにあるかがわかるようになります。各おのの検索文字列から、C
プログラムや英語のテキストから作られた、頻度の統計情報に基づいて、もっと
もめずらしい文字が選ばれます。この「めずらしい」文字を含む場所だけが調べ
られるのです。)
たとえば、特定のパターンを含む行の前にインデクスを付けるエントリを入れる 例を示します。
while (<>) { study; print ".IX foo\n" if /\bfoo\b/; print ".IX bar\n" if /\bbar\b/; print ".IX blurfl\n" if /\bblurfl\b/; ... print; }
"f" は "o" よりもめずらしいので、`/\bfoo\b/' を探すとき、$_ で "f" を含む場所だけが探されます。一般に、病的な場合を除いて、かなりの結果が得 られます。唯一の問題は、節約できる時間が、最初にリンクリストを作る時間よ りも多いかどうかです、
実行時まで、探そうとする文字列がわからないときには、ループ全体を文字列と
して組み立てて、eval
すれば、いつも、ずべてのパターンを再コンパイ
ルするという事態は避けられます。ファイル全体を一つのレコードとして入力す
るために、$/ を未定義にすれば、かなり速くなり、多くの場合 fgrep(1) のよ
うな専用のプログラムより速くなります。以下の例は、ファイルのリスト
(@files) から単語のリスト (@words) を探して、マッチするものがあったファ
イル名を出力します。
$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"; }
tr///
の節を参照してくださ
い。
Go to the first, previous, next, last section, table of contents.