変数を正規表現の中で使いたいけど変数自体に正規表現が入ってる話

こういう話。

use strict;
use warnings;
use utf8;
binmode STDOUT, ':utf8';

my $name  = 'アマガミSS+ plus';
my $title = '[アニメ][0642] アマガミSS+ plus 第01話「絢辻詞編 前編 ユウワク」';

print $title =~ /$name.+(\d+)/ ? 'matched' : 'unmatched';

my $pos = index($title, $name);
my $str = substr($title, $pos+length($name));

print "\n";
print "pos  = $pos\n";
print "str  = $str\n";
print "seen = ", ($str =~ /(\d+)/);

実行結果

unmatched
pos  = 12
str  =  第01話「絢辻詞編 前編 ユウワク」
seen = 01

「タイトル+第xx話」という形式で、xxの数字が欲しいときに正規表現でいっぺんにやってたんだけど、どうやら"アマガミSS+ plus"の"+"が正規表現と解釈されるようで。

"アマガミSS+ plus" という正規表現は "アマガミSS+ plus" という文字列にマッチしない!という、よく分からない問題が発生してしまうみたいです。

仕方ないので、indexでマッチングの確認、その後作品名以降の部分文字列を切り出してから話数のマッチングをする、という2段階の手順を踏むことにしました。

正規表現のメタ文字をエスケープしてくれる機能とかないんですかね?ぐぐっても見つからなかった・・・。

追記

コメントで教えていただきました。

use strict;
use warnings;
use utf8;
binmode STDOUT, ':utf8';

my $name  = 'アマガミSS+ plus';
my $title = '[アニメ][0642] アマガミSS+ plus 第01話「絢辻詞編 前編 ユウワク」';

print $title =~ /\Q$name\E.+(\d+)/ ? 'matched' : 'unmatched';
matched

\Qと\Eで囲った部分はエスケープされるらしいです。
あとは、quotemeta関数とかqr//とかあるみたいですね。

perlfaq6 - perldoc.perl.org

ドキュメントに書いてあった。。