re - 正規表現の振る舞いを変えるための Perl プラグマ
use re 'taint';
($x) = ($^X =~ /^(.*)$/s); # $x はここで汚染されている
$pat = '(?{ $foo = 1 })';
use re 'eval';
/foo${pat}bar/; # 失敗しない (-T スイッチがないとき)
{
no re 'taint'; # デフォルト
($x) = ($^X =~ /^(.*)$/s); # $x はここで汚染されていない
no re 'eval'; # デフォルト
/foo${pat}bar/; # 許されない (-T スイッチの有無に関係なく)
}
use re 'debug'; # コンパイル時と実行時に
/^(.*)$/s; # デバッグ情報を出力する
use re 'debugcolor'; # 'debug' と同じだが、出力に色がつく
...
use re qw(Debug All); # より細かいデバッグオプション
use re qw(Debug More);
no re qw(Debug ALL); # このスコープ内で全ての re デバッグを有効化
use re qw(is_regexp regexp_pattern); # import utility functions
my ($pat,$mods)=regexp_pattern(qr/foo/i);
if (is_regexp($obj)) {
print "Got regexp: ",
scalar regexp_pattern($obj); # just as perl would stringify it
} # but no hassle with blessed re's.
(これらの例では、デフォルトで汚染されているので $^X を使っています。)
use re 'taint' が有効で、汚染された文字列が正規表現の
ターゲットであるとき、正規表現のメモリ(もしくはリストコンテキストで
m// 演算子が返す値)は汚染されます。
この機能は汚染されたデータに対する正規表現演算が安全な部分文字列を
取り出すものでないときに便利ですが、その他の変換は働きます。
use re 'eval' が有効なとき、変数展開を含む正規表現でも
ゼロ幅表明 (?{ ... }) を持つことができます。
これは通常はセキュリティ上のリスクとなる可能性があるので許されていません。
このプラグマは正規表現が汚染されたデータからきたものである場合には
無視されることに注意してください。
つまり、汚染された正規表現を評価することは常に許されません。
perlre/(?{ code }) を参照してください。
このプラグマの目的のため、プリコンパイルされた正規表現
(つまり、qr// の結果)の展開(interpolation)は変数展開とは
みなされません。
したがって:
/foo${pat}bar/
は、$pat がプリコンパイルされた正規表現であれば、たとえ $pat が
(?{ ... }) 表明を含んでいたとしても 許されます。
use re 'debug' が有効なとき、perl は正規表現をコンパイルするときと
使うときにデバッグ用メッセージを出力します。
その出力は -DDEBUGGING が有効になっている perl インタプリタに
-Dr スイッチを与えたときと同じです。
これはマッチの複雑さに応じて非常に多弁になる可能性があります。
debug の代わりに debugcolor を使うと、termcap カラーシーケンスを
使ったカラフルな出力を端末に行います。
termcap プロパティのカンマ区切りのリストを $ENV{PERL_RE_TC} に
セットすることで、文字列のオン/オフや pre-point 部分のオン/オフを
ハイライトできます。
更なる情報については
Debugging regular expressions in perldebug を参照してください。
5.9.5 現在、
use re 'debug' 指示子およびそれと等価な設定は、他の指示子と同様
レキシカルスコープです。
しかしこれらはコンパイル時と実行時の両方に影響を及ぼします。
Pragmatic Modules in perlmodlib を参照してください。
use re 'Debug' と同様にデバッグ出力を生成しますが、
どのデバッグ情報が出力されるかを細かく制御できることが違います。
操作は、コンパイル関係、実行関係、特殊用途関係の 3 つのグループに
分割されます。
オプションは以下の通りです:
コンパイル関係のオプションを全て有効にします。
パターンのパース処理に関係するデバッグ出力を有効にします。
コンパイルの最適化フェーズに関係するデバッグ出力を有効にします。
トライ木のコンパイルに関する詳細情報。
コンパイルと最適化の後の最終的なプログラムの出力をダンプします。
実行関係のデバッグオプションを全て有効にします。
メインマッチングループのデバッグを有効にします。
トライ木をどのように実行するかに関する追加のデバッグ。
開始点最適化のデバッグを有効にします。
「追加の」デバッグオプションを全て有効にします。
マッチング中の捕捉バッファのデバッグを有効にします。 これは極めて大きい出力を生成する可能性があることを警告しておきます。
拡張された TRIE デバッグを有効にします。 TRIEE と TRIEC の両方を拡張します。
エンジンの状態のデバッグを有効にします。
エンジンの再帰スタックのデバッグを有効にします。 このオプションを有効または無効にすると、デバッグ状態も同様に 同じ状態になります。 この出力はかなり大きくなることがあります。
拡張最適化デバッグと開始位置最適化を有効にします。 正規表現自身をデバッグするのでなければ、おそらく有用ではありません。
オフセット情報をダンプします。 これは、どのように regops がパターンと関連するかを見るために使えます。 出力フォーマットは
NODENUM:POSITION[LENGTH]
文字列の最初の文字の位置は 1 です。 位置が 0 であったり、パターンの実際の長さより大きかったり、 長さが 0 であったりするかもしれないことに注意してください。
オフセット情報のデバッグを有効にします。 これは大量のトレース情報を出力し、他のデバッグオプションとはうまく かみ合いません。
ほぼ確実に、デバッグエンジンのオフセット部分をハックする人々によってのみ 有用です。
タイプ数を節約するための便利な短縮記法があります。
OFFSETS, OFFSETSDBG, BUFFERS 以外の全てのオプションを有効にします。
DUMP と、全ての実行関係のオプションを有効にします。 以下と等価です:
use re 'debug';
TRIEM と、全てのコンパイル関係および実行関係のオプションを有効にします。
5.9.5 以降、use re 'debug' 指示子およびその等価物は、その他の指示子と同様
レキシカルスコープを持ちます。
しかし、これらはコンパイル時と実行時の両方で効果があります。
perl 5.9.5 以降、're' debug には、呼び出し元の名前空間にエクスポートできる、 いくつかの便利関数を含んでいます。 以下に一覧を示します。
is_regexp($ref)引数が、qr// から返された、コンパイル済み正規表現の場合は真を、
さもなければ偽を返します。
この関数はオーバーロードや bless によって混乱しません。 内部用語で言うと、PERL_MAGIC_qr 構造体から正規表現ポインタを 取り出しているので、だまされることはありません。
regexp_pattern($ref)引数が、qr// から返された、コンパイル済み正規表現の場合、
この関数はパターンを返します。
リストコンテキストでは 2 要素のリストを返し、1 番目の要素はパターン、 2 番目はパターンがコンパイルされたときに使われた修飾子です。
my ($pat, $mods) = regexp_pattern($ref);
スカラコンテキストでは、生の qr// の中に書くことで perl が
文字列化したときに同じ内容になるものを返します。
引数がコンパイルされたリファレンスではない場合、スカラコンテキストでは
「偽だが定義済み」を返し、リストコンテキストでは空リストを返します。
従って、以下の文
if (regexp_pattern($ref) eq '(?i-xsm:foo)')
は、実際の $ref が何であっても警告は出ません。
is_regexp と同様、この関数はオブジェクトのオーバーロードや bless によって
混乱しません。
regmust($ref)引数が qr// で返されたコンパイル済み正規表現の場合、この関数は、
パターンの中でオプティマイザが最長の不動不変文字列および最長の
浮遊不変文字列と考えたものを返します。
不変文字列 (fixed string) とは、マッチングするパターンとして 現れなければならない部分文字列として定義されます。 不動不変文字列 (anchored fixed string) とは、マッチングの開始からの 特定の位置に現れなければならない不変文字列です。 浮遊不変文字列 (floating fixed string) とは、マッチングの開始からの 相対位置の範囲でどの位置に現れてもよい不変文字列として定義されます。 例えば、
my $qr = qr/here .* there/x;
my ($anchored, $floating) = regmust($qr);
print "anchored:'$anchored'\nfloating:'$floating'\n";
これの結果は
anchored:'here'
floating:'there'
パターンの中で here は .* の前にあるので、この位置は正確に
決定されます。
しかし、このことは there には当てはまりません;
これは不動不変文字列の後ならどの地点にでも現れる可能性があります。
Perl は最適化のためにこれらの両方を、長い方(同じ場合は浮遊)を優先して
使います。
注意: これは最終的な最長の不動及び浮遊文字列とは限りません。 これは Perl のオプティマイザが最長と考えたものです。 もし結果が間違っていると信じるなら、perlbug ユーティリティ経由で 報告を送ってください。
regname($name,$all)最後に成功したマッチングの名前付きバッファの内容を返します。 $all が真なら、バッファごとに一つの要素となる配列リファレンスを返します; さもなければ最初に定義されたバッファを返します。
regnames($all)最後に成功したマッチングで定義された全ての名前付きバッファのリストを 返します。 $all が真なら、定義された全ての名前を返します; さもなければマッチングに関わった名前のみを返します。
regnames_count()最後に成功したマッチングで使われたパターンで定義された、異なる名前の数を 返します。
注意: この結果は常に、定義された異なる名前付きバッファの実際の数となり、
regnames() や関連するルーチンが $all 引数をセットせずに呼び出された
場合に返したものと一致しないことがあります。