Go to the first, previous, next, last section, table of contents.


検索・置換関数

Function: index str,substr,position
Function: index str,substr
str の中の position の位置以降で、最初に substr が見つ かった位置を返します。position が省略された場合には、str の 最初から探し始めます。返却値のベースは、0 もしくは、変数 $[ に設定した値 です。surstr が見つからなかった場合には、ベースよりも 1 小さい値、 通常は -1 が返されます。

Function: m//
マッチ演算子。See section 演算子と優先順位,を参照してください。

Function: pos scalar
対象の変数に対して、前回の m//g が終了した場所のオフセットを返し ます。そのオフセットを変えるために、変更することができます。

Function: reset expr
Function: reset
通常、ループの最後に、変数をクリアし、?? 検索を再び動作するようにリセッ トするため、continue ブロックで使われます。expr は、文字を 並べたもの (範囲を指定するのに、ハイフンが使えます) と解釈されます。名前 がその文字のいずれかで始まる変数や配列は、最初の状態にリセットされます。 expr を省略すると、1回検索(?PATTERN?) を再びマッチするよう にリセットできます。カレントパッケージの変数もしくは検索だけがリセットさ れます。常に 1 を返します。例:
reset 'X';          # すべての X 変数をリセット
reset 'a-z';        # 小文字変数をリセット
reset;              # ?? 検索だけをリセット

reset "A-Z" とすると、argvenv といった配列もなく なってしまいますから、止めた方が良いでしょう。パッケージ変数だけがリセッ トされます。字句変数は、影響を受けませんが、スコープから外れれば、自動的 に綺麗になりますので、これからは、こちらを使うようにした方がよいでしょう。 このドキュメントの my の項を参照してください。

Function: rindex str,substr,position
Function: rindex str,substr
str 中で最後に見つかった substr の位置を返すことを除いて、 index と同じように動作します。position を指定すると、その位 置より前の、最後の位置を返します。

Function: s///
置換演算子。See section クォートとクォートのような演算子,を参照してください。

Function: study scalar
Function: study
次に変更される前に、何回も文字列に対するパターンマッチを行なうアプリケー ションで、そのような文字列 scalar (省略時には $_) を予め学習してお きます。これは、検索のために、どのようなパターンを何回使うかによって、ま た、検索される文字列内の文字頻度の分布によって、時間を節約することになる かもしれませんし、逆に浪費することになるかもしれません。予習をした場合と、 しない場合の実行時間を比較して、どちらが速いか調べることが、必要でしょう。 短い固定文字列 (複雑なパターンの固定部分を含みます) をたくさん検索するルー プで、もっとも効果があるでしょう。一つの時点では、一つの 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";
}

Function: tr///
変換演算子。See section 演算子と優先順位,を参照してください。

Function: y///
変換演算子。See section 演算子と優先順位,の tr/// の節を参照してくださ い。


Go to the first, previous, next, last section, table of contents.

検索式: