Perl6搜索然后替换为子例程的输出

时间:2019-05-10 12:09:51

标签: regex replace perl6 evaluation string-substitution

我已经整理了文档,但似乎无法在perl6中找到实现方法。

在perl5中,我会做的(只是一个例子):

sub func { ... }

$str =~ s/needle/func($1)/e;

即将“ needle”替换为对“ func”的调用的输出

2 个答案:

答案 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