Regex 正则表达式模式内部的公式
我可以在模式内部使用变量,例如Regex 正则表达式模式内部的公式,regex,perl,Regex,Perl,我可以在模式内部使用变量,例如 if ($param =~ /^${param}$/) 但我如何在模式内部使用公式来获得这样的结果(不正确的语法)>> 可能..?您不能将可执行的Perl代码放在正则表达式模式中(尽管您可以使用/e修饰符将其放在替换字符串中)。相反,您可以做的是动态构建模式: my $number = $foo * $bar + $baz; if ( $param =~ /^${number}.+whatever/ ) { ... } 您可以通过购物车伪运算符@{[…]}插入
if ($param =~ /^${param}$/)
但我如何在模式内部使用公式来获得这样的结果(不正确的语法)>>
可能..?您不能将可执行的Perl代码放在正则表达式模式中(尽管您可以使用
/e
修饰符将其放在替换字符串中)。相反,您可以做的是动态构建模式:
my $number = $foo * $bar + $baz;
if ( $param =~ /^${number}.+whatever/ ) { ... }
您可以通过购物车伪运算符
@{[…]}
插入任意表达式的结果。类似于@{…}
的删除运算符可以包含任意代码块。只需确保最后一条语句的计算结果是数组引用(或使用${…}
:scalarref)
例如:
my ($foo, $bar, $baz) = (3, 5, 7);
local $_ = "22, oh whatever";
if (/^@{[ $foo * $bar + $baz ]}.+whatever/) { say "ok" }
编辑 虽然上述解决方案适用于任何插值引号操作符(
qq
,qr
,qx
),但正则表达式有额外的可能性嵌入代码:(?{…})
。不同之处在于对代码求值时:
在模式编译时运行Perl语句时计算代码@{[…]}
在到达模式中的该位置时计算代码。然后将结果用作模式。这意味着,由于回溯,每个匹配可能会对代码进行多次评估(??{…})
/^(??{ $foo * $bar + $baz }).+whatever/
相当于上面的正则表达式,因为代码生成的模式不会发生回溯。不可能按您希望的方式进行,对吧。考虑到一些Perl正则表达式的外观,这可能是一件好事。:)对我知道Perl可以做到:)而且我知道一些聪明的大师会来回答这个问题。谢谢
/^(??{ $foo * $bar + $baz }).+whatever/