正規表現には 2 種類のエスケープがあります。
- リテラルの解析時に処理されるエスケープ。
- 正規表現エンジンによって処理されるエスケープ。
例えば、
\Q..\E
前者の種類です。
\d
は後者の種類です。
\n
どちらも親切です。
つまり、
"abc\Q!@#\Edef"
12 文字の文字列を生成しますabc\!\@\#def
。
qq/abc\Q!@#\Edef/
はまったく同じことです。
qr/abc\Q!@#\Edef/
12 文字の文字列を生成し、abc\!\@\#def
それを 9 文字に一致する正規表現パターンとしてコンパイルしますabc!@#def
。
しかし、一重引用符はそのようなエスケープを処理しないので、
'abc\Q!@#\Edef'
13 文字の文字列を生成しますabc\Q!@#\Edef
。
\Q
正規表現エンジンはorを認識しないため\E
、最後の文字列を渡すと警告が表示され、11 文字との一致が試行されますabcQ!@#Edef
。
修正は変更することです
my $re_str = '\d'; # Produces string \d
my $re_str_q = '\Q1\E\'; # Produces string \Q1\E
に
my $re_str = "\\d"; # Produces string \d
my $re_str_q = "\Q1\E"; # Produces string \1
またはさらに良いことに、
my $re_str = qr/\d/; # Produces regex \d
my $re_str_q = qr/\Q1\E/; # Produces regex \1
詳細については、\
具体的にお読みください。