正規表現(9) 置換演算子 s///

$text =~ m//; は $text に対する検索でしたが、検索といえば次に来るのが置換です。検索してマッチした文字列を、他の文字列に置き換えます。正規表現による置換はとても強力で、僕もよくお世話になります。(^_^)
Perl正規表現による置換は s/// 演算子を使います。スラッシュが三つありますが、次のように使います。

$text =~ s/検索パターン/置換文字列/;

まず、$text の中から「検索パターン」にマッチする部分を見つけます。見つかった場合はその部分が「置換文字列」で置き換えられます。
通常は最初に見つかった部分しか置き換えられませんが、「/g」オプションを付けると $text 中の全てのマッチする部分が置換されます。これは、m//g と似ていますね。他にも「/i」「/m」オプションも使えます。

use strict;
 
my $text = "abcABCaBcdefdefdefGHIghiGhI";
print "         $text\n";
 
$text =~ s/def/   /;        # (1)
print "/def/    $text\n";
 
$text =~ s/abc/   /g;       # (2)
print "/abc/g   $text\n";
 
$text =~ s/ghi/   /ig;      # (3)
print "/ghi/ig  $text\n";

(1) は「def」をスペース3つに置き換えます。「/g」オプションがついていないので、置き換えられるのは最初の「def」だけです。
(2) は「abc」をスペース3つに置き換えます。こちらには「/g」オプションがついているので、全ての「abc」が置き換えられますが……。そうです「/i」オプションがついていないので、大文字小文字は区別されます。なので置換されるのは全て小文字の「abc」だけです。
(3) は「ghi」をスペース3つに置き換えます。これには「/g」も「/i」もつけられているので、大文字小文字問わず全ての「ghi」が置換されるはずです。
実行結果は以下の通りです。

         abcABCaBcdefdefdefGHIghiGhI
/def/    abcABCaBc   defdefGHIghiGhI
/abc/g      ABCaBc   defdefGHIghiGhI
/ghi/ig     ABCaBc   defdef

正規表現による検索を勉強してきたおかげで、そんなに難しくは感じませんでした。(^_^)


また、s/// 演算子の返り値はスカラコンテキストでもリストコンテキストでも「置き換えした回数」が返ってくるとのこと。何も置換しなければ 0、1つでも置換すれば 1以上が返ってくるわけですね。if の条件部などにそのまま書くと 0 は偽となり、0 以外が真となるので、ツジツマが合わせやすいです。(^_^)

use strict;
 
my $text = "Palmo the student is studying Perl day by day.";
print "$text\n";
 
if ($text =~ s/student/beginner/) {
    print "Succeeded.\n";
} else {
    print "Failed.\n";
}
print "$text\n";
 
my $n = $text =~ s/day/step/g;
print "$n 'day's were replaced by 'step'\n";
print "$text\n";

if 文の条件部で置換する事で、置換できたら「Succeeded.」、できなければ「Failed.」が表示されます。また $n には「day」が「step」に置き換えられた回数が入るはずです。
実行結果は以下の通りです。

Palmo the student is studying Perl day by day.
Succeeded.
Palmo the beginner is studying Perl day by day.
2 'day's were replaced by 'step'
Palmo the beginner is studying Perl step by step.

思惑通り置換できました。(^_^)