Perl 6是否会对订单更改作出任何承诺?

时间:2009-04-20 00:21:08

标签: rules perl6

考虑到像/(foo|foobar|foobaz)/这样的替换,Perl 6会做出关于三个中哪一个将首先被使用的任何承诺,如果它在文档的哪个地方做了它会做出这样的承诺?

请参阅相关问题Does Perl currently (5.8 and 5.10) make any promises about the order alternations will be used?

2 个答案:

答案 0 :(得分:13)

仅举几个字:替代方案应该并行匹配(至少在概念上),并且最长的匹配胜出。如果你想要顺序交替,你可以使用双栏||,它提供从左到右的顺序,就像|在Perl 5正则表达式中。

答案 1 :(得分:10)

S05

  

为此,Perl 6中的每个正则表达式都必须能够将其“纯”模式与其动作区分开来,并返回其初始标记模式列表(过渡性地包括“纯”所称的任何子规则的标记模式“该正则表达式的一部分,但不包括任何一个子规则,因为这将涉及自引用,这在传统正则表达式中是不允许的)。使用|的逻辑交替然后将这些列表中的两个或多个以及调度发送到与最长令牌前缀匹配的备选项。这可能是也可能不是词汇首先出现的替代方案。

     

但是,如果两个替代方案在相同的长度上匹配,则首先按特异性打破平局。从最长的固定字符串开始的替代方案获胜;也就是说,精确匹配计数比使用字符类进行的匹配更接近。如果这不起作用,则由两种方法中的一种破坏。如果备选方案使用不同的语法,则标准MRO(方法解析顺序)决定首先尝试哪一个。如果备选方案位于相同的语法文件中,则文本上较早的备选方案优先。 (如果在多个文件中定义了语法规则,则该顺序是未定义的,如果首先尝试了错误的规则,则必须使用显式断言来强制失败。)

这似乎与Perl 5中的承诺完全不同。