Поиск Perl6 затем заменить выводом подпрограммы - PullRequest
15 голосов
/ 10 мая 2019

Я прочесал документы, но не могу найти, как это сделать в perl6.

В perl5 я бы сделал (просто пример):

sub func { ... }

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

т.е. заменить «иглу» на вывод вызова «func»

Ответы [ 2 ]

14 голосов
/ 10 мая 2019

В 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;

Что приводит к "Я шью иглой". Также обратите внимание, что захваты нумеруются от 0 в Perl 6, а не 1. Если вы просто хотите получить всю захваченную строку, вместо нее введите $/.

11 голосов
/ 10 мая 2019

Хорошо, поэтому мы начнем с создания функции, которая просто возвращает наш ввод, повторенный 5 раз

sub func($a) { $a x 5 };

Сделайте нашу строку

my $s = "Here is a needle";

И вот замена

$s ~~ s/"needle"/{func($/)}/;

Несколько вещей, на которые стоит обратить внимание.Поскольку мы просто хотим сопоставить строку, мы ее цитируем.И наш вывод - это строка в двойных кавычках, поэтому для запуска функции мы используем {}.Модификатор e не требуется, поскольку все строки допускают экранирование такого типа.

В документах по подстановке упоминается, что объект Match помещен в $/, поэтому мы передаем егонаша функция.В этом случае объект Match при приведении к строке просто возвращает сопоставленную строку.И мы получаем в качестве нашего окончательного результата.

Here is a needleneedleneedleneedleneedle
...