この節では、正規表現の最もポピュラーな利用法である置換演算子 s/// について紹介します。 置換演算子は特殊変数$_を対象に、最初の//の間の正規表現にマッチした文字列を次の//の間の文字列や式の値で置き換えてくれます。 置換演算子の構文は次のとおりです。
s/正規表現/置きかえる文字列/;
次に例を紹介します。
$_ = "My name is Masahide.";
s/Masahide/can/;
print "$_\n";
上のスクリプトでは、$_の中の文字列"Masahide"を文字列"can"に置き換えています。 「正規表現」の部分だけでなく「置きかえる文字列」の部分でも変数展開がされるので、
$_ = "My name is Masahide.";
$name = "Masahide";
$nick_name = "can";
s/$name/$nick_name/;
print "$_\n";
としても最初のスクリプトと同じように"My name is can."と出力されます。
また、パターンマッチ演算子//と同様、パターン結合演算子=~によって、$_以外のスカラー変数や、スカラーを返す式を対象にして、検索と置換をすることも出来ます。
$word = "My name is Masahide.";
$word =~ s/Masahide/can/;
print "$word\n";
さらに、/以外の区切り文字を使うことも出来ます。 //演算子の場合には先頭にmをつけましたが、s///演算子の場合は必要ありません。
s#アンパン#クリームパン#;
さて、"choose(選ぶ)"を"cheese(チーズ)"に置換しようとして次のスクリプトを書きました。 これを実行するとどうなるでしょうか?
$word = "choose";
$word =~ s/o/e/;
print "$word\n";
上のスクリプトからの出力は"cheose"となって、意味のない言葉になってしまいました。 これは、"choose"の最初の"o"だけを"e"に置き換えたためです。 2つ目の"o"も"e"に置きかえるには次のように/g修飾子を使います。
$word = "choose";
$word =~ s/o/e/g; #/g修飾子を追加
print "$word\n";
前節でもチョットだけ紹介しましたが、/g修飾子はマッチする物を全て見つけてくれます。 このほかにもs///演算子では次のような修飾子が使えます。
修飾子 | 処理 |
---|---|
g | マッチする物を全て見つける |
o | 1回だけ変数展開をする |
i | 大文字と小文字を区別しない |
m | 単一行として扱う |
s | 複数行として扱う |
e | 置きかえる文字列を式と見て実行 |
x | 拡張正規表現を使用 |
s///演算子でも後方参照を使うことが出来ます。
s/(.+)\@(.+)/$1/;
#メールアドレスからユーザ名を取り出す
s/(\W)/\\$1/g;
#非英数文字に\をつける
置換演算子は正規表現にマッチした文字列を別の文字列に置き換えるものでしたが、変換演算子は文字列の変換や削除をするのに使います。 変換演算子の構文は次のとおりです。
tr/変換対象文字列/変換する文字列/;
tr///演算子は、デフォルトでは特殊変数$_を対象に、変換対象文字列(最初の//の間の文字)を全て洗い出し、対応する位置にある変換文字列(次の//の間の文字)で置き換えます。 また置換演算子同様、=~演算子によってスカラー変数に対して変換をすることも出来ます。 次に使用例を紹介します。
tr/+/ /; #+を半角スペースに変換
tr/abc/ABC/;
#"a"、"b"、"c"をそれぞれ
#"A"、"B"、"C"に変換
また変換対象文字列が変換する文字列よりも長い場合、変換文字列の中の最後の文字が繰り返されます。
$word = "abcdefg";
print "$word\n";
$word =~ tr/cdefg/hij/;
print "$word\n";
上の例の場合、変換対象文字列の方が変換文字列よりも長く、"f"と"g"に対する変換文字列がありません。 このようなときには、変換文字列の最後の文字(今の場合は"j")が繰り返され、$wordには"hijjj"が格納されます。
この節では置換演算子、変換演算子について見てきました。 これらの演算子はCGI等でも頻繁に使われているものです。 しっかりマスターしておきたいですね(自戒を込めて)。 次の節では文字列の分解と結合について紹介します。