我可以在模式内使用变量,例如
if ($param =~ /^${param}$/)
但是我怎样才能在模式中使用一个公式来得到这样的东西(语法不正确)>>
if ($param =~ /^0*{param+0}$/)
可能的..?
您可以通过购物车伪运算符 插入任意表达式的结果@{[ ... ]}
。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/
将等效于上述正则表达式,因为不会发生对代码生成的模式的回溯。
您不能将可执行的 Perl 代码放入正则表达式模式中(尽管您可以将其放入带有/e
修饰符的替换字符串中。)您可以做的是动态构建您的模式:
my $number = $foo * $bar + $baz;
if ( $param =~ /^${number}.+whatever/ ) { ... }