晴耕雨読

working in the fields on fine days and reading books on rainy days

[Regex] Perlでマッチした文字列を式や関数を使って変換する

Perlでは置換するときに正規表現の「e」オプションを使うことで、自分の好きな関数を呼び出して文字列を置換することができます。 以下は料金の部分を税額を加算した料金に置換する例です。

$text = "りんご300円、バナナ200円、さくらんぼ400円";

sub addTax {
  my ($price) = @_;
  return $price * 1.1;
}

$text =~ s/(\d+)円/addTax($1)."円(税込)"/eg;

print $text, "\n";
# => りんご330円(税込)、バナナ220円(税込)、さくらんぼ440円(税込)

重要な点は、正規表現の置換をする s/// の末尾に「e」があることです。 これにより置換後の文字列を記述する部分が式として評価されます。 マッチした文字列を抽出する (...) と、それを取得する $N と組み合わせて使うことで、より柔軟な置換処理が実現できるようになります。

以上です。

参考文献