我有两个代码,我认为应该是等价的.第一个用于<|w>指定字边界,其中非字字符(或字符串的开头)应该在H之前.第二个例子使用了<<,它应该做同样的事情.
my $string = 'Hamadryas perlicus';
say $string ~~ /
    <?after <|w> Hamadryas \s+ >
    (\w+)
    /;
say $string ~~ /
    <?after << Hamadryas \s+ >
    (\w+)
    /;
第一个匹配,但第二个不匹配:
?perlicus?
 0 => ?perlicus?
Nil
这两个还有其他一些区别吗?
Timotimo在 IRC 频道中的回答暗示了为什么会出现这种情况。当您使用 时after,您实际上是在翻转正则表达式。然后你必须从右向左翻转,这样就可以了。
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这将产生您正在寻找的东西。
\n