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"

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

ReratedPosts

Mojoliciousでディレクトリの場所を変数(属性)として格納する方法
perlのgrep関数の使い方|変数とか戻り値とか複数条件とかのまとめ
Mojoliciousで「[error] Role::Tiny 2.000001+ is required for roles」のエラーが出た時の対処法
perl(Mojolicious)をレンタルサーバーXserverを使って公開する手順まとめ
perlでIO::Socketを使う時に「permission deny」と言うエラーが出た時の対処法
perlで「Can't locate Sample/Module.pm in @INC」と言うエラーが起こる原因と対処法3つ