在列表中§

请参阅主要文档 in context 了解routine grep

sub    grep(Mu $matcher*@elems:$k:$kv:$p:$v --> Seq:D)
method grep(List:D:  Mu $matcher:$k:$kv:$p:$v --> Seq:D)

返回一个元素序列,其中 $matcher 智能匹配。这些元素按它们在原始列表中出现的顺序返回。

示例

say ('hello'122/742'world').grep: Int;              # OUTPUT: «(1 42)␤» 
say grep { .Str.chars > 3 }'hello'122/742'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({! /<[aeiou]>/})     # OUTPUT: «(b c d f)␤»

上述示例之所以有效,是因为布尔上下文中的正则表达式应用于 $_。在这种情况下,!/<[aeiou]>/ 正则表达式布尔化并否定结果。针对 Callable(在这种情况下是 Block)进行智能匹配会返回该可调用对象返回的值,因此正则表达式的布尔化结果用于决定当前值是否应保留在 grep 的结果中。

可选命名参数 :k:kv:p:v 提供与切片相同的功能

  • k

仅按顺序返回匹配元素的索引值。

  • kv

按顺序返回索引和匹配元素。

  • p

按顺序将索引和匹配元素作为 Pair 返回。

  • v

仅返回匹配元素(与根本不指定任何命名参数相同)。

示例

say ('hello'122/742'world').grep: Int:k;
# OUTPUT: «(1 3)␤» 
say grep { .Str.chars > 3 }:kv'hello'122/742'world';
# OUTPUT: «(0 hello 2 3.142857 4 world)␤» 
say grep { .Str.chars > 3 }:p'hello'122/742'world';
# OUTPUT: «(0 => hello 2 => 3.142857 4 => world)␤»

在供应中§

请参阅主要文档 in context 了解method grep

method grep(Supply:D: Mu $test --> Supply:D)

创建一个新供应,仅发出原始供应中与 $test 智能匹配的值。

my $supplier = Supplier.new;
my $all      = $supplier.Supply;
my $ints     = $all.grep(Int);
$ints.tap(&say);
$supplier.emit($_for 1'a string'3.14159;   # prints only 1

在任何中§

请参阅主要文档 in context 了解method grep

method grep(Mu $matcher:$k:$kv:$p:$v --> Seq)

通过应用其 .list 方法将调用者强制转换为 list,并在其上使用 List.grep

对于未定义的调用者,基于 $matcher,返回值可以是 ((Any)) 或空列表。

my $a;
say $a.grep({ True }); # OUTPUT: «((Any))␤» 
say $a.grep({ $_ });   # OUTPUT: «()␤»

在 HyperSeq 中§

请参阅主要文档 in context 了解method grep

method grep(HyperSeq:D: $matcher*%options)

grep 应用于 HyperSeq,类似于在 Seq 上执行此操作的方式。

my @hyped = (^10000).map(*²).hyper;
@hyped.grep* %% 3 ).say;
# OUTPUT: «(0 9 36 81 144 ...)␤» 

当你在 Seq 上使用 hyper 时,这实际上是调用的方法。

在 RaceSeq 中§

请参阅主要文档 in context 了解method grep

method grep(RaceSeq:D: $matcher*%options)

grep 应用于 RaceSeq,类似于在 Seq 上执行此操作的方式。

my @raced = (^10000).map(*²).race;
@raced.grep* %% 3 ).say;
# OUTPUT: «(0 9 36 81 144 ...)␤» 

当你在 Seq 上使用 race 时,这实际上是调用的方法。