raku - 在 Perl 6 中过滤匹配两个正则表达式的元素
问题描述
这里发生了一些我不太明白的事情。
> my @arr = <ac bc abc>
> @arr.grep: (( * ~~ /a/ ) && ( * ~~ /b/ ))
(bc abc)
但
> @arr.grep(* ~~ /a/).grep(* ~~ /b/)
(abc)
什么原因?
解决方案
你已经想出了完美的解决方案。
另一个是:
my @arr = <ac bc abc>
@arr.grep: { $_ ~~ /a/ && $_ ~~ /b/ }
(abc)
这个答案的其余部分只是解释了这个问题。这个问题中的问题是WhatStar &&
WhatStar所涵盖的问题的更复杂版本。
如果它们是代码,则逻辑操作不会执行它们的参数。
所以{ $_ ~~ /a/ } && { $_ ~~ /b/ }
返回{ $_ ~~ /b/ }
。
或* ~~ /a/ && * ~~ /b/
返回* ~~ /b/
。
同时,如果它是代码或正则表达式,grep
则执行它的匹配器,所以这些都是相同的:
foo.grep: { $_ ~~ /.../ }
foo.grep: * ~~ /.../;
foo.grep: /.../;
Junction
s的魔力
您的Junction
解决方案似乎很自然。如果有人可以解释我在下面缺少的内容,我会很高兴。虽然我希望它能够工作,但它正在弯曲我的头来弄清楚它实际上是如何工作的,但我认为它类似于(但不完全是):
foo & bar
变成和。Junction
_foo
bar
尝试
grep
使用 aJunction
作为参数进行调用。因为
Junction
在正常值Any
层次结构之外,大多数例程没有匹配的签名。grep
没有。当您调用例程并且没有相应的签名时,初始调度失败并且我们命中调度回退处理程序。这可能是方法一。
如果调度回退处理程序看到有
Junction
参数,那么它会提取 中的各个值Junction
并启动逻辑并行的“线程”(目前从来没有真正的线程,但如果编译器认为这是一个好主意,则允许它们成为真正的线程)对应于这些值。因此,它对调用grep
者的每个元素调用两次,并将结果输出回Junction
与传入 相同类型的新元素Junction
。在布尔上下文中, a
Junction
折叠为单个结果。(如果 a
Junction
在整体布尔上下文中,那么它可以(并行)根据结果短路。如果它是 anany
并且有任何结果出现,True
那么它可以取消其余的 - 或者如果它实际上正在做,则首先不做它们事情是按顺序进行的,目前总是如此。如果它是一个all
并且任何结果出现,False
它可以取消其余的。等等。)
推荐阅读
- flutter - Audience Network - 涉嫌捆绑和展示位置违规的申诉限制为 3 次
- python - response.xpath() 和 Selector(text=response.text).xpath() 有什么区别
- javascript - 在子嵌套数组中使用聚合错误填充同一级别的演员和导演:不填充它们
- video - 我可以通过编码来控制手机的机械机制吗?
- python - Heroku 应用程序:ModuleNotFoundError:没有名为“pwa”的模块
- c++ - 未安装 ubuntu 上的 C++ 的 OpenCv
- mql4 - 如何编辑 .ex4 MQL4 可执行文件?
- node.js - Firebase 函数错误,“db.batch() 不是函数”
- java - 我正在实现一个选取框效果,但它不适用于 Android Studio
- docker - Docker run -v:无法挂载绑定卷:“无效的卷规范”