我在变量中有一个正则表达式,其中包含一个\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),默认设置.
\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+';