我试图理解为什么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
我已经使用了一个单独的变量。我在这里错过了什么?谢谢......第一次发布!
答案 0 :(得分:3)
正则表达式中的变量插值就像字符串中的变量插值。它不会将整个字符串作为表达式进行评估,只需要完成变量即可。试试这个:
$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/;
答案 1 :(得分:1)
在第一个正则表达式中,{}
curlies不代表量词,而是字面字符。 +
仍然是量词的(不按照您的预期执行添加)并且会匹配$a
1次或多次,因此正则表达式设置为匹配字符串,
perl -e '$a=2;print "ab{222221}bbc" =~ /(b{$a+1})/'
输出
b{222221}
请参阅perlre:
{n,m} n和m仅限于非负数 小于建立perl时定义的预设限制的整数值。
答案 2 :(得分:1)
变量在正则表达式中被替换,正如您在第二个命令中找到的那样,但它不是正则表达式编译器执行代码的标准功能。然而,有一个实验性的特征(至少,我认为它仍然是实验性的),它允许这样做:
perl -e '$a=2;print "abbbc" =~ m/^a(??{"b\{".($a+1)."\}"})c$/ ? "match\n" : "no match\n";'
您可以在perldoc中找到有关该信息的更多信息,但请注意它有limitations。就个人而言,如果其他人试图维护代码并且不了解该功能,我会对此保持警惕。
编辑:单身?嵌入式代码的版本不正确,更新版本插件很丑(即使你要整理它)!继续更新正则表达式之外的变量并保持可读性!