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

时间:2014-01-14 12:42:12

标签: regex perl

如果'是分隔符,或者从变量进行插值,则正则表达式\QW\ERQWER匹配,而不与WR匹配(在v5.6.2,v5中观察到)。 Perl的10.1和v5.18.2以及http://www.perlfect.com/articles/regextutor.shtml),i。例如,模式中的\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

输出:

$re = \QW\ER
m'\QW\ER' matches QWERT
/$re/     matches QWERT
/\QW\ER/  matches WRONG

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

这是一个错误吗? ... 一项功能? ......记录在哪里?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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)

由于'\QW\ER'是一个定界符为' '的构造,它不提供插值,\Q \E不能作为引用转义符