Last Update 2008/05/18
パターンマッチ及び検索置換の処理方法を変更する際に、デリミタの最後に付けて使用します。
複数の機能を組み合わせて利用することも可能です。
複数の機能を組み合わせて利用することも可能です。
パターンマッチ・検索置換共通
i : 大文字小文字を区別しない
g : 最初にマッチしたところで止めず、全てのマッチを試みる
s : 対象文字列を全て同一行として処理する
m : 対象文字列を全て複数行として処理する
o : 変数などを利用して繰り返しパターンを利用する場合などに、パターンを固定と解釈し、評価を1度のみとする
x : コメントと空白文字を使えるようにするなど、拡張表現の使用を可能にする
検索置換のみ
e : 置換文字部分を式として評価する
(例1)
$_ = "test1test2test3Test4";
# 先頭が大文字のパターン
if (/Test\d/)
{
print "$&\n";
}
# 大文字小文字を区別しないマッチ
if (/Test\d/i)
{
print "$&\n";
}
実行結果
Test4
test1
(例2)
$_ = "test1test2test3Test4";
@a_test = ();
# "test + 整数" のパターン
if (@a_test = /(test\d)/)
{
print "@a_test\n";
}
# "g" を指定して全てのマッチを試みる
if (@a_test = /(test\d)/g)
{
print "@a_test\n";
}
実行結果
test1
test1 test2 test3
(例3)
$_ = "test1test2test3Test4";
@a_test =
/(
test1| # "test1" のマッチを試みる(ここは正規表現のコメント)
test2 # "test2" のマッチを試みる(ここは正規表現のコメント)
)/;
print "@a_test\n";
# コメントや空白がパターンと認識されるためマッチしない
@a_test =
/(
test1| # "test1" のマッチを試みる(ここは正規表現のコメント)
test2 # "test2" のマッチを試みる(ここは正規表現のコメント)
)/x;
print "@a_test\n";
# "x" を指定したため空白文字及びコメントが認識される
# 最初にマッチした "test1" が返される
実行結果
test1
(例4)
$_ = "test1test2\ntest3Test4";
# 行頭の "test3" にマッチを試みる
@a_test = /(^test3)/;
print "@a_test\n";
# "test3" は行頭と認識されないのでマッチしない
# "s" を指定して行頭の "test3" にマッチを試みる
@a_test = /(^test3)/s;
print "@a_test\n";
# パターンは全て同一行と解釈され "test3" は行頭と認識されずマッチしない
# "m" を指定して行頭の "test3" にマッチを試みる
@a_test = /(^test3)/m;
print "@a_test\n";
# パターンは複数行と解釈され "test3" は行頭と認識されるのでマッチする
実行結果
test3
(例5)
$_ = "test1test2\ntest3Test4";
$s_test1 = "test1";
$s_test2 = "test2";
$n = 0;
$n_time_s = time();
for ($i=0; $i<1000000; $i++)
{
if (/($s_test1|$s_test2|test)($s_test1|$s_test2|test1)/)
{
$n++;
}
}
print "ループ $n回(パターン再評価有り) 所要時間 : " . (time() - $n_time_s) . "秒\n";
$n = 0;
$n_time_s = time();
for ($i=0; $i<1000000; $i++)
{
if (/($s_test1|$s_test2|test)($s_test1|$s_test2|test1)/o)
{
$n++;
}
}
print "ループ $n回(パターン再評価無し) 所要時間 : " . (time() - $n_time_s) . "秒\n";
実行結果(FreeBSD)
ループ 1000000回(パターン再評価有り) 所要時間 : 8秒
ループ 1000000回(パターン再評価無し) 所要時間 : 4秒
実行結果(Windows)
ループ 1000000回(パターン再評価有り) 所要時間 : 5秒
ループ 1000000回(パターン再評価無し) 所要時間 : 5秒
(例6)
$ptn1 = "test1test2";
$ptn2 = "test1test2";
# 置換文字列に式を利用
$ptn1 =~ s/test1/"test" . "0"/;
{
print "$ptn1\n"; # 式を評価せずそのまま表示
}
# "e" を指定して置換文字列に式を利用
$ptn2 =~ s/test1/"test" . "0"/e;
{
print "$ptn2\n"; # 式を評価した結果を表示
}
実行結果
"test" . "0"test2
test0test2