在Perl中grep
,map
取一个表达式和一个列表,并计算列表中每个元素的表达式.
两者有什么区别?
grep
返回原始列表中与表达式匹配的元素,同时map
返回应用于原始列表的每个元素的表达式的结果.
$ perl -le 'print join " ", grep $_ & 1, (1, 2, 3, 4, 5)' 1 3 5 $ perl -le 'print join " ", map $_ & 1, (1, 2, 3, 4, 5)' 1 0 1 0 1
第一个示例打印列表中的所有奇数元素,而第二个示例打印0或1,具体取决于相应的元素是否为奇数.
我发现思考grep()
并map()
以最一般的形式思考是有帮助的:
grep {BLOCK} LIST map {BLOCK} LIST
grep()
是一个过滤器:它返回LIST中BLOCK返回true的项子集.
map()
是一个映射函数:将一个值从LIST发送到BLOCK,BLOCK返回一个包含0个或更多值的列表; 所有这些BLOCK调用的组合集将是返回的最终列表map()
.