grep BLOCK LIST
grep EXPR,LIST

这在精神上类似于,但与 grep(1) 及其相关命令不同。特别是,它不限于使用正则表达式。

对于 LIST 中的每个元素,评估 BLOCK 或 EXPR(在本地将 $_ 设置为每个元素),并返回一个列表值,该列表值包含表达式计算结果为真的元素。在标量上下文中,返回表达式为真的次数。

my @foo = grep(!/^#/, @bar);    # weed out comments

或等效地,

my @foo = grep {!/^#/} @bar;    # weed out comments

请注意,$_ 是列表值的别名,因此它可以用来修改 LIST 的元素。虽然这很有用且受支持,但如果 LIST 的元素不是变量,则会导致奇怪的结果。类似地,grep 返回到原始列表的别名,就像 for 循环的索引变量是列表元素的别名一样。也就是说,修改 grep 返回的列表中的元素(例如,在 foreachmap 或另一个 grep 中)实际上会修改原始列表中的元素。在编写清晰的代码时,通常应该避免这种情况。

另请参见 map,用于由 BLOCK 或 EXPR 的结果组成的列表。