置換演算子 (substitution operator) s///
を使うと、正規表現にマッチしたテキストを置換することができます。
$line =~ s/PATTERN/REPLACEMENT/[OPTION]
という構文で、文字列 $line
に含まれる PATTERN というテキストを REPLACEMENT に置換し、$line
に書き戻します。
対象となる文字列が $_
である場合は、結合演算子 (binding operator) =~
までの部分($line =~
の部分)は省略することができます。
オプション | 何の略称か | 意味 |
---|---|---|
e | eval | 置換用の文字列を実行時に評価する |
g | global | マッチするものを全て置換し、置換数を返す |
i | ignore | 大文字、小文字を無視 |
m | multiple | 文字列を複数行として扱う (\n を行の区切りとみなす) |
o | once | パターン部分のコンパイルを一度だけする |
s | single | 文字列を単一行として扱う (\n を行の区切りとみなさない) |
x | extended | 空白類の無視 |
$_ = 'I am John.';
s/John/Bob/; # $_ の値は 'I am Bob.' になる
print;
while (<>) {
s/</</g;
s/>/>/g;
print;
}
s///
演算子による文字列置換の結果は、置換が行われた場合は真、行われなかった場合は偽になります。
$is_replaced = s/from/to/;
$is_replaced = $line =~ s/from/to/;
置換演算子のデリミタには、スラッシュ以外の記号を使用することができます。
s!from!to!
s|from|to|
s#from#to#
s?from?to?
デリミタとして括弧を使用することもできますが、その場合は、正規表現パターン部分と置換文字列部分をそれぞれ一対の記号で囲む必要があります。
s{from}{to}
s<from><to>
s[from]<to>
s{from}#to#
s?from?(to)
正規表現パターンや、置換文字列部分に登場しないデリミタを使用することで、可読性を上げることができます。
s{http://}{ftp://};
置換演算子 s///
演算子は、デフォルトでは 1 箇所の文字列しか置換を行いません。
正規表現に一致するすべての文字列を置換する場合は、修飾子 /g
を付ける必要があります。
$_ = 'abc abc abc';
s/abc/XYZ/; # $_ は 'XYZ abc abc' になる
$_ = 'abc abc abc';
s/abc/XYZ/g; # $_ は 'XYZ XYZ XYZ' になる