这在精神上类似于,但与 grep(1) 及其相关命令不同。特别是,它不限于使用正则表达式。
对于 LIST 中的每个元素,评估 BLOCK 或 EXPR(在本地将 $_
设置为每个元素),并返回一个列表值,该列表值包含表达式计算结果为真的元素。在标量上下文中,返回表达式为真的次数。
my @foo = grep(!/^#/, @bar); # weed out comments
或等效地,
my @foo = grep {!/^#/} @bar; # weed out comments
请注意,$_
是列表值的别名,因此它可以用来修改 LIST 的元素。虽然这很有用且受支持,但如果 LIST 的元素不是变量,则会导致奇怪的结果。类似地,grep 返回到原始列表的别名,就像 for 循环的索引变量是列表元素的别名一样。也就是说,修改 grep 返回的列表中的元素(例如,在 foreach
、map
或另一个 grep
中)实际上会修改原始列表中的元素。在编写清晰的代码时,通常应该避免这种情况。
另请参见 map
,用于由 BLOCK 或 EXPR 的结果组成的列表。