为什么Perl会抱怨\ Q ..\E正则表达式部分中无法匹配的括号?

Dan*_*ité 3 regex perl

我在变量中有一个正则表达式,其中包含一个\Q...\E包含开括号的子串.我期待[解析器将其解释为一个vanilla字符,因为它在一个\Q...\E部分内.

当正则表达式作为程序中的文字出现时,似乎就是这种情况,但是当它出现在变量中时,解析器就会失败.

这是一个简化的例子.

这有效:

$r = qr/\Qa[b\E\d+/;
if ("a[b1" =~ $r) { print "match\n"; }
Run Code Online (Sandbox Code Playgroud)

这失败了:

$v='\Qa[b\E\d+';
$r=qr/$v/;
Run Code Online (Sandbox Code Playgroud)

它在第2行死亡

无与伦比[在正则表达式; 标记为< - HERE in m /\Qa [< - HERE b\E\d + /

为什么Perl会拒绝这个?并且只有在从变量插值而不是使用相同的正则表达式内联时?

我在FAQ中找不到任何解释它的内容我如何匹配变量中的正则表达式?或perlop的Regexp报价操作员.

如果版本很重要,则使用Perl 5.14.2(Ubuntu 12.04),默认设置.

ike*_*ami 6

\Q与正则表达式无关.当正则表达式引擎看到\Q它时,它无法识别它,发出警告,并将其视为\\Q.

>perl -we"$re='\Qa'; qr/$re/
Unrecognized escape \Q passed through in regex; marked by <-- HERE in m/\Q <-- HERE a/ at -e line 1.
Run Code Online (Sandbox Code Playgroud)

与插值一样,\Q由双引号字符串文字识别和类似.像插值一样,它必须是文字(Perl代码)的一部分才能工作.

>perl -E"$pat=q{\Q!}; say qr/$pat/"
(?^u:\Q!)

>perl -E"$pat=qq{\Q!}; say qr/$pat/"
(?^u:\!)

>perl -E"$x='!'; $pat=q{$x}; say qr/$pat/"
(?^u:$x)

>perl -E"$x='!'; $pat=qq{$x}; say qr/$pat/"
(?^u:!)
Run Code Online (Sandbox Code Playgroud)

解决方案:

  • $v="\Qa[b\E\\d+";
  • $v=qr/\Qa[b\E\d+/;
  • $v=quotemeta('a[b').'\d+';