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.