Объединение регулярных выражений с использованием цикла в Perl 6

Здесь я делаю regex вручную из Regex элементы массива.

my Regex @reg =
  / foo /,
  / bar /,
  / baz /,
  / pun /
  ;

my $r0 = @reg[0];
my $r1 = @reg[1];

my Regex $r = / 0 $r0 | 1 $r1 /;

"0foo_1barz" ~~ m:g/<$r>/;
say $/;  # (「0foo」 「1bar」)

Как это сделать с for @reg {...}?

2 ответа

Решение

Если переменная содержит регулярное выражение, вы можете использовать его без лишних слов в другом регулярном выражении.

Второй трюк заключается в использовании переменной массива внутри регулярного выражения, что эквивалентно дизъюнкции элементов массива:

my @reg =
  /foo/,
  /bar/,
  /baz/,
  /pun/
  ;

my @transformed = @reg.kv.map(-> $i, $rx { rx/ $i $rx /});

my @match =  "0foo_1barz" ~~ m:g/ @transformed /;

.say for @match;
my @reg =
  /foo/,
  /bar/,
  /baz/,
  /pun/
  ;

my $i = 0;

my $reg = @reg
  .map({ $_ = .perl; $_.substr(1, $_.chars - 2); })
  .map({ "{$i++}{$_}" })
  .join('|');

my @match = "foo", "0foo_1barz" ~~ m:g/(<{$reg}>) /;

say @match[1][0].Str;
say @match[1][1].Str;

# 0foo
# 2baz

Посмотреть документы

Изменить: На самом деле читать документы самостоятельно. Неявный eval изменен на конструкцию $().

Редактировать: переписал ответ на то, что на самом деле работает

Изменить: Изменен ответ на ужасный, ужасный взлом

Другие вопросы по тегам