匹配一个连接点使得 Match 不可变

gro*_*ber 7 regex match junction raku

只是为了它,我试图用raku 中的运算符(在该页面上搜索)匹配正则表达式的连接点m// Explicit topic match

perl6REPL 中:

> any('a','b') ~~ m/./
False
Run Code Online (Sandbox Code Playgroud)

之后,无论我怎么称呼,m//我都会收到一个不可变的匹配投诉:

> 'x' ~~ m/./
Cannot modify an immutable Match (?a?)
  in block <unit> at <unknown file> line 1
Run Code Online (Sandbox Code Playgroud)

这里的幕后发生了什么?

讨论

问题似乎源于将$/ 特殊变量设置为结点

any(?a?, ?b?)
Run Code Online (Sandbox Code Playgroud)

在路口比赛之后,似乎是?a?在路口引起了投诉。

只要我做任何改变$/其他事情的事情,功能就会恢复:

> $/=Any
(Any)
> 'x' ~~ m/./
?x?
Run Code Online (Sandbox Code Playgroud)

或者

> 'x' ~~ /./
?x?
> 'x' ~~ m/./
?x?
Run Code Online (Sandbox Code Playgroud)

(所以先匹配//,以便改变$/然后匹配m//)。

澄清

我不想“实现”超出问题要求的任何东西:我只是想了解这种行为。

编辑

出于交叉引用的目的,这现在也是一个rakudo github 问题,正如@jjmerelo 所建议的那样。

gro*_*ber 4

我认为,关于比赛是否应该返回FalseTrue解决的附带问题,在@raiph 的评论中。

另一方面,接收错误的主要问题immutable Match似乎一个错误,至少在我的系统上修复了它

所以问题是(根据提交消息)正则表达式匹配对象不应该是连接。

  • 问题并不在于它们不应该成为交汇点。问题是一些 Match 内部处理传递了“$/”容器进行分配,但它*没有*具有“Mu”约束。这导致尝试对 Junction 的*每个*本征态进行分配,但在第一个上失败(因为本征态是不可变的),而不是分配给包含 Junction 的容器(从而替换它)。https://github.com/rakudo/rakudo/commit/5b3691817a 修复了这个问题。 (2认同)