Raku: использование тематической переменной (от 'for') внутри регулярного выражения

У меня есть код, который работает как положено:

my @words = 'foo', 'bar';
my $text = 'barfoo';

for @words -> $to-regex {
    $text ~~ m/ ($to-regex) {say "matched $0"}/;
}

Он печатает:

matched foo
matched bar

Однако, если я попытаюсь использовать переменную темы в цикле for, например:

for @words { # implicit "-> $_", AFAIK
    $text ~~ m/ ($_) {say "matched $0"}/;
}

Я получаю это:

matched barfoo
matched barfoo

Те же результаты с использованием постфикса для:

$text ~~ m/ ($_) {say "matched $0"}/ for @words; # implicit "-> $_", AFAIK

Это частный случай переменной темы внутри регулярного выражения?

Должен ли он содержать всю строку, с которой сопоставляется?


person Julio    schedule 17.10.2020    source источник
comment
Обратите внимание, что регулярные выражения в raku ужасно медленны, и если вы можете их избегать, вам следует их избегать. Здесь, например, если кто-то просто ищет наличие substr в str, стоит подумать об использовании метода index.   -  person Holli    schedule 17.10.2020


Ответы (1)


Оператор смарт-матча имеет 3 этапа

  1. псевдоним левого аргумента временно на $_
  2. запустите выражение справа
  3. позвоните .ACCEPTS($_) по этому результату

Так что это не особый случай для регулярного выражения, это то, как ~~ всегда работает.

for 1,2,3 {
    $_.print;
    'abc' ~~ $_.say
}
# 1abc
# 2abc
# 3abc
person Brad Gilbert    schedule 17.10.2020