我认为这两段代码应该是等价的。第一个使用<|w>
指定一个单词边界,其中非单词字符(或字符串的开头)应该在 H 之前。第二个例子使用<<
,它应该做同样的事情。
my $string = 'Hamadryas perlicus';
say $string ~~ /
<?after <|w> Hamadryas \s+ >
(\w+)
/;
say $string ~~ /
<?after << Hamadryas \s+ >
(\w+)
/;
第一个匹配,但第二个不匹配:
「perlicus」
0 => 「perlicus」
Nil
这两个还有其他区别吗?
答案 0 :(得分:3)
This answer by timotimo提示了为什么会发生这种情况。当您使用after
时,您实际上正在翻转正则表达式。然后你必须向左翻转,这样就行了。
use v6;
my $string = 'Hamadryas perlicus';
say $string ~~ /
<?after Hamadryas <|w> \s+ >
(\w+)
/;
say $string ~~ /
<?after Hamadryas « \s+ >
(\w+)
/;
这将产生你想要的东西。