我试图理解为什么 Perl 似乎没有评估用于定义匹配中特定出现次数的花括号内的表达式:
用表达式:
$ perl -e '$a=2;print "abbbc" =~ m/b{$a+1}/ ? "match\n" : "no match\n";'
no match
没有表达:
$ perl -e '$a=3;print "abbbc" =~ m/b{$a}/ ? "match\n" : "no match\n";'
match
我求助于使用单独的变量。我在这里缺少什么?谢谢...第一篇文章!
最佳答案
正则表达式中的变量插值就像字符串中的变量插值。它不会将整个字符串作为表达式进行评估,而只是完成变量所需的评估。尝试这个:
$a = 3;
print "{$a+1}\n";
你会看到你的正则表达式中发生了什么。
$a
被替换,+1
保留为 +1
.和 /x{1+1}/
不等同于 /x{2}/
.您使用单独变量的方法是我使用的方法。但是还有其他的可能性,比如
$a = 3;
print "{${\($a+1)}}\n";
print "yes\n" if "abbbbc" =~ /ab{${\($a+1)}}c/;
${\(...)}
包装器使表达式成为用于插值的单个单元。但它很丑。另一个版本是使用 @{[...]}
将其作为数组来执行。像这样:$a = 3;
print "yes\n" if "abbbbc" =~ /ab{@{[$a+1]}}c/;
我觉得这两个都比
$a = 3;
$aplus1 = $a + 1;
print "yes\n" if "abbbbc" =~ /ab{$aplus1}c/;
关于regex - 带有花括号内表达式的 Perl 正则表达式无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27567965/