Perl6 搜索然后用子程序的输出替换

Posted

技术标签:

【中文标题】Perl6 搜索然后用子程序的输出替换【英文标题】:Perl6 search then replace with output of subroutine 【发布时间】:2019-09-28 08:30:49 【问题描述】:

我已经梳理了文档,但似乎无法在 perl6 中找到如何做到这一点。

在 perl5 中我会这样做(只是一个例子):

sub func  ... 

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

即用调用 'func' 的输出替换 'needle'

【问题讨论】:

【参考方案1】:

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。如果您只想要整个捕获的字符串,请改为传递 $/

【讨论】:

【参考方案2】:

好的,我们先创建一个函数,它只返回我们的输入重复 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

【讨论】:

"needle" 当然可以是一个实际的正则表达式,它也可以正常工作。 嗨,西蒙。不错的快速干净的答案。 "needle" 也可以是 needle,不带引号。为了清楚起见,您可能选择/更喜欢引用它?

以上是关于Perl6 搜索然后用子程序的输出替换的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 perl6 嵌入到 C(或 C++)程序中?

怎样搜索或替换换行符?

用java编写一段程序,输入一段字符串,然后输出该字符串的倒序状态。

ZZNUOJ_用C语言编写程序实现1154:二分搜索(附完整源码)

C语言编写字符替换程序。

以后没有 Perl 6 了!Perl 之父同意改名