匹配 Junction 使 Match 不可变

Matching a Junction makes Match immutable

我正试图匹配 raku 中的 junction against a regex with the m// operator(在该页面上搜索 Explicit topic match)。

perl6 REPL 中:

> any('a','b') ~~ m/./
False

之后,无论我如何调用 m//,我都会收到不可变匹配投诉:

> 'x' ~~ m/./
Cannot modify an immutable Match (「a」)
  in block <unit> at <unknown file> line 1

问题

幕后发生了什么?

讨论

问题似乎源于 $/ special variable 被设置为 junction

any(「a」, 「b」)

在路口比赛之后,似乎是 「a」 在路口提出投诉。

一旦我做了任何将 $/ 更改为其他内容的操作,功能就会恢复:

> $/=Any
(Any)
> 'x' ~~ m/./
「x」

> 'x' ~~ /./
「x」
> 'x' ~~ m/./
「x」

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

澄清

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

编辑

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

以下可能都是胡说八道。但我要发表我的即时反应,吃甜点,然后进一步探索。 :)

有效的代码

say any('a','b') ~~ /./; # False
say 'x' ~~ /./;          # 「x」

有什么区别?我删除了 ms.

为什么不同?

它们有不同的含义。

您在这些情况下的大概意思是对 ~~ 的 RHS 上的正则表达式与 ~~.

的 LHS 上的值进行正则表达式匹配

但我认为您实际写的是 ~~ 的 RHS 上的 sub-expressions,它首先对 $_[=39 进行正则表达式匹配=],然后是后续匹配(只是智能匹配,不是正则表达式匹配)前面的正则表达式匹配(即匹配对象或 Nil)的 结果 ~~.

的 LHS 上的值

我还没有探索为什么你得到不可变的东西,但我认为以上是第一步。如果结果是胡说八道,我稍后会删除这个答案。 :)

关于比赛应该 return False 还是 True 的附带问题,我认为,在 中由 @raiph 解决。

另一方面,收到 immutable Match 错误的主要问题 was, it seems, a bug, with a commit 至少在我的系统上修复了它。

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