Perl正则表达式与花括号内的表达不按预期工作

Mic*_*nta 5 regex perl

我试图理解为什么Perl似乎没有评估用于在匹配中定义特定出现次数的花括号内的表达式:

表达式:

$ perl -e '$a=2;print "abbbc" =~ m/b{$a+1}/ ? "match\n" : "no match\n";'
no match
Run Code Online (Sandbox Code Playgroud)

没有表达:

$ perl -e '$a=3;print "abbbc" =~ m/b{$a}/ ? "match\n" : "no match\n";'
match
Run Code Online (Sandbox Code Playgroud)

我使用了一个单独的变量.我在这里错过了什么?谢谢......第一次发帖!

小智 3

正则表达式中的变量插值类似于字符串中的变量插值。它不会将整个字符串作为表达式进行评估,而是按照完成变量所需的程度进行评估。尝试这个:

$a = 3;
print "{$a+1}\n";
Run Code Online (Sandbox Code Playgroud)

你会看到你的正则表达式中发生了什么。被$a替换并且+1保留为 a +1。并且/x{1+1}/不等同于/x{2}/.

我会使用您使用单独变量的方法。但还有其他可能性,比如

$a = 3;
print "{${\($a+1)}}\n";
print "yes\n" if "abbbbc" =~ /ab{${\($a+1)}}c/;
Run Code Online (Sandbox Code Playgroud)

包装${\(...)}器使表达式成为插值的单个单元。但它很丑。另一个版本是将其作为数组来执行,@{[...]}如下所示:

$a = 3;
print "yes\n" if "abbbbc" =~ /ab{@{[$a+1]}}c/;
Run Code Online (Sandbox Code Playgroud)

我觉得这两个都比

$a = 3;
$aplus1 = $a + 1;
print "yes\n" if "abbbbc" =~ /ab{$aplus1}c/;
Run Code Online (Sandbox Code Playgroud)