1

我可以在模式内使用变量,例如

if ($param =~ /^${param}$/)

但是我怎样才能在模式中使用一个公式来得到这样的东西(语法不正确)>>

if ($param =~ /^0*{param+0}$/)

可能的..?

4

2 回答 2

3

您可以通过购物车伪运算符 插入任意表达式的结果@{[ ... ]}。derererence 运算符 like@{ ... }可以包含任意代码块。只需确保最后一条语句计算为数组引用(或使用${ ... }: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/

将等效于上述正则表达式,因为不会发生对代码生成的模式的回溯。

于 2013-06-28T18:51:55.593 回答
-1

您不能将可执行的 Perl 代码放入正则表达式模式中(尽管您可以将其放入带有/e修饰符的替换字符串中。)您可以做的是动态构建您的模式:

my $number = $foo * $bar + $baz;
if ( $param =~ /^${number}.+whatever/ ) { ... }
于 2013-06-28T18:30:46.980 回答