【问题标题】:Filtering elements matching two regexes in Perl 6在 Perl 6 中过滤匹配两个正则表达式的元素
【发布时间】:2018-09-30 09:23:23
【问题描述】:

这里发生了一些我不太明白的事情。

> my @arr = <ac bc abc>
> @arr.grep: (( * ~~ /a/ ) && ( * ~~ /b/ ))
(bc abc)

但是

> @arr.grep(* ~~ /a/).grep(* ~~ /b/)
(abc)

什么原因?

【问题讨论】:

  • @raiph 谢谢!不确定我对答案了解多少,所以我最简单的解决方案是:@a.grep: { /a/ &amp;&amp; /b/ }
  • @raiph 奇怪的是,即使是 Juncture 也能正常工作:@a.grep: /a/&amp;/b/

标签: raku


【解决方案1】:

你已经想出了完美的解决方案。

另一个是:

my @arr = <ac bc abc>
@arr.grep: { $_ ~~ /a/ && $_ ~~ /b/ }
(abc)

这个答案的其余部分只是解释了问题。这个问题中的问题是WhateverStar &amp;&amp; WhateverStar 所涵盖问题的更复杂版本。


如果是代码,逻辑操作不会执行它们的参数。

所以{ $_ ~~ /a/ } &amp;&amp; { $_ ~~ /b/ } 返回{ $_ ~~ /b/ }

或者* ~~ /a/ &amp;&amp; * ~~ /b/ 返回* ~~ /b/

同时,grep确实执行它的匹配器,如果它是代码或者它是一个正则表达式,所以这些都是一样的:

foo.grep: { $_ ~~ /.../ }
foo.grep:    * ~~ /.../;
foo.grep:         /.../;

Junctions 的魔力

您的Junction 解决方案似乎很自然。如果有人可以解释我在下面缺少的内容,我会很高兴。虽然我预计它会起作用,但它正在低头弄清楚它是如何工作的,但我认为它类似于(但不完全是):

  • foo &amp; bar 变为 Junctionfoo bar

  • 尝试使用Junction 作为参数调用grep

  • 因为Junction 在正常的Any 值层次结构之外,大多数例程没有匹配的签名。 grep 没有。

  • 当您调用例程并且没有相应的签名时,初始调度会失败,我们会触发调度回退处理程序。 This可能是方法一。

  • 1234563但是如果编译器认为这是一个好主意,则允许它们使它们成为真正的线程)对应于这些值。因此,它会为调用者的每个元素调用两次grep,并将结果输出回与传入Junction 相同类型的新Junction
  • 在布尔上下文中,Junction 折叠为单个结果。

  • (如果 Junction 处于整体布尔上下文中,则它可以(并行)根据结果短路。如果它是 any 并且 any 结果来自 @ 987654350@ 然后它可以取消其余的 - 或者如果它实际上是按顺序执行操作,则首先不执行它们,就像目前的情况一样。如果它是 all 并且任何结果出现在 False 它可以取消休息等)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    • 1970-01-01
    • 2016-03-15
    • 2016-06-29
    相关资源
    最近更新 更多