【问题标题】:When is Perl 6's <|w> word boundary not a << word boundary?Perl 6 的 <|w> 字边界何时不是 << 字边界?
【发布时间】:2018-11-06 01:47:31
【问题描述】:

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

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

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

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

「perlicus」
 0 => 「perlicus」
Nil

这两者还有其他区别吗?

【问题讨论】:

  • 嗯,« 是left word boundary。但这仅意味着它应该起作用。我把它改到右边了,它也不起作用,所以肯定有别的东西在起作用......

标签: regex raku


【解决方案1】:

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+)
    /;

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

【讨论】:

  • FWIW,我认为这是一个错误,我认为 rakudo 应该为你翻转 « 和 »。
  • 现在有一个用于 nqp 的分支,将在发布后合并(除非出现大问题,否则将在接下来的几天内合并),并且 RT 中有两个错误,以及规范需要为 rakudo 准备的翻转锚的测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2011-11-25
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-05-26
  • 1970-01-01
相关资源
最近更新 更多