匹配路口使匹配不可变

问题描述

仅此而已,我正在尝试将junction与正则表达式与在raku中的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被设置为结点的事实

any(「a」,「b」)

交界处比赛后,似乎「a」在交界处引发了投诉。

只要我执行将$/更改为其他内容的任何操作,功能就会恢复:

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

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

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

说明

我没有试图“解决”问题以外的任何问题:我只是想了解这种行为。

修改

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

解决方法

@raiph在the comment中解决了比赛应该返回False还是True的附带问题。

另一方面,收到immutable Match错误was的主要问题似乎是一个错误,并且至少在我的系统上有a commit可以解决。

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

,

以下可能全部是poppycock。但是我将发布我的即时反应,吃甜点,然后再探索。 :)

有效代码

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

区别?我丢了m

为什么有区别?

它们的含义不同。

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

但是我认为您实际上写的是~~的RHS上的子表达式,首先对$_ 进行正则表达式匹配,然后对结果的em>后续匹配(只是一个智能匹配,而不是 regex匹配)与Nil的LHS上的值的匹配对象或~~)。

我还没有探索为什么您会得到不可变的东西,但是我认为以上是第一步。如果事实证明这是胡说八道,我将在稍后删除该答案。 :)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...