grep语法:
map BLOCK LIST # BLOCK 由{}标志, 需要注意这里没有逗号
map EXPR,LIST # EXPR 通常是正则表达式,需要注意不要忽略这里的逗号
解释:
grep 的第一个参数是代码块, 第二个参数是列表
代码块: $_会轮流成为列表中每个元素的别名,并且根据代码块的返回结果对列表进行筛选。
应用一 :从一大堆数字中挑出奇数:
my @odd_numbers = grep { $_ % 2 } 1..1000;
应用二: 从一个文件中取出包含‘fred’的行
方式一:
open FH, "<", 'filename.txt' #打开文件
my @matching_lines = grep { /\bfred\b/i } FH; #搜索
方式二:
open FH, "<", 'filename.txt' #打开文件
my @matching_lines = grep /\bfred\b/i ,FH; #搜索
应用三: 求列表中的值的平方:
my @numbers = grep { $_ = $_ * $_ } 1..10;
map语法:
map BLOCK LIST # 需要注意的是 map的第二个参数还是列表!!!
map EXPR,LIST # 需要注意的是 map的第二个参数还是列表!!!
解释:
第一个参数可以是代码块或者正则表达式,第二个参数是列表
工作方式和grep相似,都是将$_设成列表每个元素的别名并且逐个为它们执行代码块。但是map使用代码块的最后一个表达式的方式和grep不同,它返回的不是逻辑的真假值,而是该表达是的实际计算结果,最终返回的一系列这样的结果组成的列表。
应用一: 求平方
my @squares = map { $_ * $_ } 1..10;
应用二: 转变列表成哈希
my %squares = map { $_ => $_ * $_ } 1..10;
应用三:移除小于等于5的数组元素,对大于5的元素求平方
my @squares = map { $_ > 5 ? ( $_ * $_ ) : () } 1..10;