只是为了见鬼,我试图在raku中使用m//
运算符将连接与正则表达式匹配(在该页面上搜索显式主题匹配
)。
在perl6
REPL中:
> 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//
匹配)。
澄清
我并没有试图“实现”任何超出问题要求的东西:我只是想理解这种行为。
编辑
出于交叉引用的目的,这现在也是一个rakudo
github问题,正如@jjmerelo所建议的那样。
我认为,匹配是否应该返回False
或True
的附带问题在@raiph的评论中得到了解决。
另一方面,接收不可变匹配
错误的主要问题似乎是一个bug,至少在我的系统上有一个提交可以修复它。
所以问题是(根据提交消息)正则表达式匹配对象不应该是连接。
以下可能都是胡说八道。但我要发表我的即时反应,吃甜点,然后进一步探索。:)
say any('a','b') ~~ /./; # False
say 'x' ~~ /./; # 「x」
区别?我删除了m
s。
它们有不同的含义。
在这些情况下,您可能的意思是对~~
的RHS上的正则表达式与~~
的LHS上的值进行正则表达式匹配。
但是我认为你实际上写的是~~
的RHS上的子表达式,它首先对$_
进行正则表达式匹配,然后对前面正则表达式匹配的结果(即匹配对象或Nil
)对~~
的LHS上的值进行后续匹配(只是智能匹配,而不是正则表达式匹配)。
我还没有探索为什么你会得到不可变的东西,但我认为上面是第一步。如果结果证明是无稽之谈,我会稍后删除这个答案。:)