提问者:小点点

匹配Junction使Match不可变


只是为了见鬼,我试图在raku中使用m//运算符将连接与正则表达式匹配(在该页面上搜索显式主题匹配)。

perl6REPL中:

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

之后,无论我如何调用m//,我都会收到一个不可变匹配的抱怨:

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

问题

这里的幕后发生了什么?

讨论

问题似乎源于$/特殊变量设置为连接

any(「a」, 「b」)

路口匹配后,似乎是路口的“a”提出了投诉。

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

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

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

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

澄清

我并没有试图“实现”任何超出问题要求的东西:我只是想理解这种行为。

编辑

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


共2个答案

匿名用户

我认为,匹配是否应该返回FalseTrue的附带问题在@raiph的评论中得到了解决。

另一方面,接收不可变匹配错误的主要问题似乎是一个bug,至少在我的系统上有一个提交可以修复它。

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

匿名用户

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

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

区别?我删除了ms。

它们有不同的含义。

在这些情况下,您可能的意思是对~~的RHS上的正则表达式与~~的LHS上的值进行正则表达式匹配。

但是我认为你实际上写的是~~的RHS上的子表达式,它首先对$_进行正则表达式匹配,然后对前面正则表达式匹配的结果(即匹配对象或Nil)对~~的LHS上的值进行后续匹配(只是智能匹配,而不是正则表达式匹配)。

我还没有探索为什么你会得到不可变的东西,但我认为上面是第一步。如果结果证明是无稽之谈,我会稍后删除这个答案。:)