Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 正则表达式模式内部的公式_Regex_Perl - Fatal编程技术网

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/