我试图理解为什么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)