为什么Perl模式中的`\ Q``\E`在某些情况下被解释为文字`Q``E`?

Arm*_*ali 6 regex perl

如果'是分隔符,或者如果是从变量进行插值,则正则表达式\QW\ER匹配QWER与否WR(使用Perl的v5.6.2,v5.10.1和v5.18.2以及http://www.perlfect.com/articles/regextutor进行观察. shtml),即\Q \E在模式中不被解释为引用转义,而是作为文字Q E.

例:

#!/usr/bin/env perl
$re = '\QW\ER';
print '$re = ', $re, "\n";
while (<DATA>)
{
    print qw(/\QW\ER/), "  matches ", $_ if /\QW\ER/;
    print qw(m'\QW\ER'), " matches ", $_ if m'\QW\ER';
    print qw(/$re/), "     matches ", $_ if /$re/;
}
__DATA__
QWERT
WRONG
Run Code Online (Sandbox Code Playgroud)

输出:

$re = \QW\ER
m'\QW\ER' matches QWERT
/$re/     matches QWERT
/\QW\ER/  matches WRONG
Run Code Online (Sandbox Code Playgroud)

(只有最后一行是我的预期.)

这是一个错误吗?... 一项功能?......随处记录?

per*_*eal 6

如果您使用带有转义的字符串来定义正则表达式,则可能正在观察此:

# don't use strings if you have escapes:
#  my $re = '(?<=\QW\E)R';
my $re = qr/(?<=\QW\E)R/;
/($re)/ and print "$_: $1\n" for qw(QWERT WRONG);
Run Code Online (Sandbox Code Playgroud)


Arm*_*ali 6

我在Perl语言参考,perlop部分找到了解释:

以下转义序列可用于插值的构造,...

\Q          quote (disable) pattern metacharacters till \E or
            end of string
\E          end either case modification or quoted section
            (whichever was last seen)
Run Code Online (Sandbox Code Playgroud)

由于'\QW\ER'是分隔符的构造' ',它不提供插值,\Q \E因此不能作为引用转义.