5

我有这个按预期工作的代码:

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

这是正则表达式中主题变量的特例吗?

它是否应该保存与之匹配的整个字符串?

4

1 回答 1

8

智能匹配算子有 3 个阶段

  1. 将左参数临时别名为$_
  2. 运行右边的表达式
  3. 调用.ACCEPTS($_)那个结果

因此,这不是正则表达式的特例,它~~始终是有效的。

for 1,2,3 {
    $_.print;
    'abc' ~~ $_.say
}
# 1abc
# 2abc
# 3abc
于 2020-10-17T03:55:16.507 回答