正規表現には 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
詳細については、\具体的にお読みください。