善用foreach,map 和 grep
1. 通过foreach来进行列表元素的只读遍历
如果是仅仅要遍历列表中的所有元素,那么foreach循环就已经足够了。
另外,所有用到foreach的地方都可以改用等价的简写名for.
2.用map函数从现有列表延展出新列表
如果是从现有列表推导出新列表,请使用map函数。
my @sizes = map {-s} @files ; my @sizes = map -s,@files;
my @stem = map {/(.*)\.txt$/} @files my ($from) = map /^From:\s+(.*)$/,@message_lines ;
map 在做数据转换时,返回模式匹配操作符m//内部圆括号捕获的数据。 因为这是一个列表上下文,所以m//返回要么是没有匹配的空列表,要是匹配时找到的结果集而成的列表。
出于对性能的考虑,对原始列表内容改变的话,就改用foreach 循环。
使用map操作,要明确他的意义在于返回相应的列表数据,而不是用作控制结构做一堆杂事。
3.用foreach修订列表元素的内容
如果要修改列表元素的内容,请使用foreach 循环。 和map 和 grep 一样,循环体中的控制变量其实是列表当前元素的别名。所以修改变量,实际就是修改原始数据
#移除数组中各个元素的数字 foreach (@array) {tr /0-9//d } #使用s/// De版本,更慢一些 foreach (@array) {s/\d//g}
4. 用grep 筛选列表元素
grep 比较特别,一般用于刷选列表元素或对元素计数
grep 块的第一个参数,不管是表达式还是代码块,都是标量上下文中的。
在标量上下文中,grep 返回的是符合条件的元素的个数,而不是元素列表。