perlで正規表現で文字列を置換したり、新しい変数に格納する方法

Perlを使っている時に、正規表現にマッチした文字列を新しい文字列に直したり(置換)、その置換した文字列を新しい変数に格納したい時がある。

Perlで正規表現にマッチした所を置換する方法

Perlで正規表現にマッチした所を置換するためには、以下のようにする。

my $str = "tanaka,yamada,nakata";

$str =~ s/(\w+)/hello/g;

print $str;

=result
"hello,hello,hello"

ポイントになるのは、s/(\w+)/hello/g;の書き方。普通の正規表現は/(\w+)/のように書くのが一般的だが、置換をしたい場合は先頭にsを付ける。

そして、s/(\w+)/hello/(\w+)の部分でマッチさせたい正規表現(または文字列)を記述し、helloの部分にはマッチした正規表現を置き換える文字列を記述する。

最後のgはグローバルマッチングの略で、マッチしたすべての文字列に対して置換を行うようにする。(gを書いておかないと、最初にマッチした正規表現だけを置換するようになる。)

参考:perlrequick - Perl 正規表現のクイックスタート - perldoc.jp

置換した文字列を新たな変数に格納する

置換した文字列を新たな変数に格納する場合は、正規表現を使う前に新しい変数を用意してコピーをしておくと良い。

my $str     = "tanaka,yamada,nakata";
my $new_str = $str;

$new_str =~ s/(\w+)/hello/g;

print $str;
print $new_str;

=result

"tanaka,yamada,nakata"
"hello,hello,hello"

これが一番素直な方法だと思うけど、もっとシンプルなやり方があるかもしれない。