這與 grep(1) 及其相關函式精神類似,但並不相同。特別是,它不限於使用正規表示式。
對 LIST 的每個元素評估 BLOCK 或 EXPR(將 $_
本地設定為每個元素),並傳回由表達式評估為 true 的那些元素組成的列表值。在標量上下文中,傳回表達式為 true 的次數。
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 結果組成的清單。