在列表中§
请参阅主要文档 in context 了解routine grep
sub grep(Mu , *, :, :, :, : --> Seq)method grep(List: Mu , :, :, :, : --> Seq)
返回一个元素序列,其中 $matcher
智能匹配。这些元素按它们在原始列表中出现的顺序返回。
示例
say ('hello', 1, 22/7, 42, 'world').grep: Int; # OUTPUT: «(1 42)»say grep , 'hello', 1, 22/7, 42, 'world'; # OUTPUT: «(hello 3.142857 world)»
请注意,如果你想 grep 不匹配的元素,可以使用 none
-Junction
say <a b 6 d 8 0>.grep(none Int); # OUTPUT: «(a b d)»say <a b c d e f>.grep(none /<[aeiou]>/); # OUTPUT: «(b c d f)»
grep 不匹配元素的另一个选项是使用块
say <a b c d e f>.grep() # OUTPUT: «(b c d f)»
上述示例之所以有效,是因为布尔上下文中的正则表达式应用于 $_
。在这种情况下,!
将 /<[aeiou]>/
正则表达式布尔化并否定结果。针对 Callable
(在这种情况下是 Block
)进行智能匹配会返回该可调用对象返回的值,因此正则表达式的布尔化结果用于决定当前值是否应保留在 grep 的结果中。
可选命名参数 :k
、:kv
、:p
、:v
提供与切片相同的功能
k
仅按顺序返回匹配元素的索引值。
kv
按顺序返回索引和匹配元素。
p
按顺序将索引和匹配元素作为 Pair
返回。
v
仅返回匹配元素(与根本不指定任何命名参数相同)。
示例
say ('hello', 1, 22/7, 42, 'world').grep: Int, :k;# OUTPUT: «(1 3)»say grep , :kv, 'hello', 1, 22/7, 42, 'world';# OUTPUT: «(0 hello 2 3.142857 4 world)»say grep , :p, 'hello', 1, 22/7, 42, 'world';# OUTPUT: «(0 => hello 2 => 3.142857 4 => world)»
在供应中§
请参阅主要文档 in context 了解method grep
method grep(Supply: Mu --> Supply)
创建一个新供应,仅发出原始供应中与 $test
智能匹配的值。
my = Supplier.new;my = .Supply;my = .grep(Int);.tap();.emit() for 1, 'a string', 3.14159; # prints only 1
在任何中§
请参阅主要文档 in context 了解method grep
method grep(Mu , :, :, :, : --> Seq)
通过应用其 .list
方法将调用者强制转换为 list
,并在其上使用 List.grep
。
对于未定义的调用者,基于 $matcher
,返回值可以是 ((Any))
或空列表。
my ;say .grep(); # OUTPUT: «((Any))»say .grep(); # OUTPUT: «()»
在 HyperSeq 中§
请参阅主要文档 in context 了解method grep
method grep(HyperSeq: , *)
将 grep
应用于 HyperSeq
,类似于在 Seq
上执行此操作的方式。
my = (^10000).map(*²).hyper;.grep( * %% 3 ).say;# OUTPUT: «(0 9 36 81 144 ...)»
当你在 Seq
上使用 hyper
时,这实际上是调用的方法。
在 RaceSeq 中§
请参阅主要文档 in context 了解method grep
method grep(RaceSeq: , *)
将 grep
应用于 RaceSeq
,类似于在 Seq
上执行此操作的方式。
my = (^10000).map(*²).race;.grep( * %% 3 ).say;# OUTPUT: «(0 9 36 81 144 ...)»
当你在 Seq
上使用 race
时,这实际上是调用的方法。