Perl 6的<| w>字边界何时不是<<字边界?

bri*_*foy 10 regex perl6 raku

我有两个代码,我认为应该是等价的.第一个用于<|w>指定字边界,其中非字字符(或字符串的开头)应该在H之前.第二个例子使用了<<,它应该做同样的事情.

my $string = 'Hamadryas perlicus';
say $string ~~ /
    <?after <|w> Hamadryas \s+ >
    (\w+)
    /;

say $string ~~ /
    <?after << Hamadryas \s+ >
    (\w+)
    /;
Run Code Online (Sandbox Code Playgroud)

第一个匹配,但第二个不匹配:

?perlicus?
 0 => ?perlicus?
Nil
Run Code Online (Sandbox Code Playgroud)

这两个还有其他一些区别吗?

jjm*_*elo 4

Timotimo在 IRC 频道中的回答暗示了为什么会出现这种情况。当您使用 时after,您实际上是在翻转正则表达式。然后你必须从右向左翻转,这样就可以了。

\n\n
use v6;\n\nmy $string = \'Hamadryas perlicus\';\nsay $string ~~ /\n    <?after  Hamadryas <|w> \\s+ >\n    (\\w+)\n    /;\n\nsay $string ~~ /\n    <?after Hamadryas \xc2\xab \\s+ >\n    (\\w+)\n    /;\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将产生您正在寻找的东西。

\n

  • FWIW,我认为这是一个错误,我认为 rakudo 应该为你翻转“和”。 (6认同)
  • 现在有一个 nqp 分支,将在发布后合并(除非出现大问题,否则将在接下来的几天内合并),并且 RT 中有两个错误,以及需要翻转锚点的规范测试'd for rakudo。 (3认同)