问题在于:
my regex a { || @b }
say $line ~~ m:i/ <a> /
那是
a
regex负责匹配
@b
,它不是用
:i
.
在Perl6中,regex是代码,您不能从这样的距离改变regex的工作方式。
然后还有一个问题:
my regex a { :i || @b }
它实际上被编译为:
my regex a {
[ :i ]
||
[ @b ]
}
那就是比赛
ignorecase[nothing]
如果失败(不会失败)匹配
@乙
.
使用的唯一理由
|| @â¦
使其与中的值匹配
@â¦
它们的定义顺序。
> my @c = < abc abcd foo >;
> say 'abcd' ~~ / || @c /
ï½¢abcï½£
我认为在大多数情况下,让它成为默认值会更好
|
语义学。
> my @c = < abc abcd foo >;
> say 'abcd' ~~ / | @c /
ï½¢abcdï½£
> say 'abcd' ~~ / @c /
ï½¢abcdï½£
因此,这将按您希望的方式工作:
my regex a { :i @b }
那就是
<a>|<b>
将匹配起始表达式最长的。同时
<a>||<b>
将尝试
<a>
首先,如果失败了,它会尝试
<b>
.
如果你真的想
||
语义,任何一个都可以工作:
my regex a { || :i @b }
my regex a { :i [|| @b] }
以下没有
γ
语义学。
事实上
γ
什么都不做。
my regex a { || [:i @b] }
与此相同:
my regex a { | :i @b }
my regex a { :i @b }