什么时候Perl 6< | w>字边界不是<<单词边界?

时间:2018-04-20 13:39:01

标签: regex perl6 raku

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

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

say $string ~~ /
    <?after << Hamadryas \s+ >
    (\w+)
    /;

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

「perlicus」
 0 => 「perlicus」
Nil

这两个还有其他区别吗?

1 个答案:

答案 0 :(得分:3)

IRC频道中的

This answer by timotimo提示了为什么会发生这种情况。当您使用after时,您实际上正在翻转正则表达式。然后你必须向左翻转,这样就行了。

use v6;

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

say $string ~~ /
    <?after Hamadryas « \s+ >
    (\w+)
    /;

这将产生你想要的东西。