我已经整理了文档,但似乎无法在perl6中找到实现方法。
在perl5中,我会做的(只是一个例子):
sub func { ... }
$str =~ s/needle/func($1)/e;
即将“ needle”替换为对“ func”的调用的输出
答案 0 :(得分:14)
Perl 6中没有e
修饰符;而是将右手部分视为双引号字符串。因此,最直接的调用方法是在函数名称前加上&
并使用函数调用插值法:
# An example function
sub func($value) {
$value.uc
}
# Substitute calling it.
my $str = "I sew with a needle.";
$str ~~ s/(needle)/&func($0)/;
say $str;
这将导致“我用针缝制”。还要注意,捕获在Perl 6中从0开始编号,而不是从1开始。如果只需要捕获的整个字符串,则改为传递$/
。
答案 1 :(得分:11)
好的,所以我们首先创建一个函数,该函数将返回的输入重复5次
sub func($a) { $a x 5 };
输入我们的字符串
my $s = "Here is a needle";
这是替换
$s ~~ s/"needle"/{func($/)}/;
需要注意的事情。因为我们只想匹配一个字符串,所以我们引用它。而且我们的输出实际上是一个双引号字符串,因此我们可以使用{}
在其中运行一个函数。不需要e
修饰符,因为所有字符串都允许这种转义。
The docs on substitution提到Match对象放在$/
中,因此我们将其传递给函数。在这种情况下,Match对象在转换为String时仅返回匹配的字符串。我们得到了最终结果。
Here is a needleneedleneedleneedleneedle