Mam ten kod, który działa zgodnie z oczekiwaniami:

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

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

Drukuje:

matched foo
matched bar

Jeśli jednak próbuję użyć zmiennej tematycznej na pętli, jak w:

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

Rozumiem:

matched barfoo
matched barfoo

Te same wyniki przy użyciu postfixa dla:

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

Czy to specjalny przypadek zmiennej tematycznej wewnątrz regexa?

Czy to ma utrzymywać cały ciąg, który pasuje?

5
Julio 17 październik 2020, 04:20

1 odpowiedź

Najlepsza odpowiedź

Operator Smart-Mecz ma 3 etapy

  1. alias tymczasowo lewy argument do $_
  2. Uruchom wyrażenie po prawej stronie
  3. Zadzwoń .ACCEPTS($_) w tym wyniku

Więc nie jest to specjalny przypadek na regex, tak działa ~~.

for 1,2,3 {
    $_.print;
    'abc' ~~ $_.say
}
# 1abc
# 2abc
# 3abc
8
Brad Gilbert 17 październik 2020, 03:55