匹配 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」
有什么区别?我删除了 m
s.
为什么不同?
它们有不同的含义。
您在这些情况下的大概意思是对 ~~
的 RHS 上的正则表达式与 ~~
.
的 LHS 上的值进行正则表达式匹配
但我认为您实际写的是 ~~
的 RHS 上的 sub-expressions,它首先对 与 $_
[=39 进行正则表达式匹配=],然后是后续匹配(只是智能匹配,不是正则表达式匹配)前面的正则表达式匹配(即匹配对象或 Nil
)的 结果 与 ~~
.
的 LHS 上的值
我还没有探索为什么你得到不可变的东西,但我认为以上是第一步。如果结果是胡说八道,我稍后会删除这个答案。 :)
关于比赛应该 return False
还是 True
的附带问题,我认为,在 中由 @raiph 解决。
另一方面,收到 immutable Match
错误的主要问题 was, it seems, a bug, with a commit 至少在我的系统上修复了它。
所以问题是(根据提交消息)正则表达式匹配对象不应该是联结。
我正试图匹配 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」
有什么区别?我删除了 m
s.
为什么不同?
它们有不同的含义。
您在这些情况下的大概意思是对 ~~
的 RHS 上的正则表达式与 ~~
.
但我认为您实际写的是 ~~
的 RHS 上的 sub-expressions,它首先对 与 $_
[=39 进行正则表达式匹配=],然后是后续匹配(只是智能匹配,不是正则表达式匹配)前面的正则表达式匹配(即匹配对象或 Nil
)的 结果 与 ~~
.
我还没有探索为什么你得到不可变的东西,但我认为以上是第一步。如果结果是胡说八道,我稍后会删除这个答案。 :)
关于比赛应该 return False
还是 True
的附带问题,我认为,在
另一方面,收到 immutable Match
错误的主要问题 was, it seems, a bug, with a commit 至少在我的系统上修复了它。
所以问题是(根据提交消息)正则表达式匹配对象不应该是联结。