《入门书籍》: Perl语言入门 ,Perl进阶
grep操作符
grep操作符可以通过表达式or块形式,将列表中的每个元素按照顺序依次取出,然后根据一定形式对其求值,最后将满足条件的元素赋值于某个列表。
在不了解grep操作符之前,如果想对列表中的元素进行处理提取符合要求的元素时,通常只能用foreach循环列表,但这样是不效率的做法。 1. 取出数组@array中大于2的元素
my @result = grep {$_ > 10} @array;
my @result = grep $_ > 10, @array;
不仅可以使用判断语句,还可以使用正则表达式,如从@input数组中取出1开头的数字
my @out = grep /^1/, @input;
使用代码块(也就是N行代码,我是这么理解的),对数组输入的元素进行选择判断,最后输出通过条件的元素,比如判断@array数组中的元素在%hash中对应的键值是否能被2整除
my @result = grep { my $in = $hash{$_}; $in % 2; } @array
从上可看出,只要满足条件,即输出是布尔值表达式也是可以的
上述代码写的通俗点就是
my @result = grep { my $in = $hash{$_}; if ($in % 2) { 1; }else{ 0; } } @array
一个很常见的例子,去除@array数组中的重复元素
my @uniq = grep {++$count{$_} < 2} @array;
map操作符
map操作符其实跟grep的类似的用法,但是从概念上稍微有点不一样。grep可以认为是筛选出符合条件的元素,不对元素对任何改变;而map则不一样,其可以将输入的元素进行转化,然后再输出。map操作符也有分表达式和块形式两者。
PS.最开始我即可就将map当做foreach来用的,可以说就是因为map比foreach少几个字母!!当然如果是复杂的块代码,而且是对N个数组以及其他数据结果进行操作的,并且不用考虑元素的最终输出,那么我觉得map代替foreach也未尝不可。
将数组@array中每个元素都加1
my @result = map $_ + 1, @array;
将数组@array中元素作为%hash的键并赋值为1,这个在对@array中元素进行去重比较好用,而且代码也很简洁
my %hash = map {$_, 1} @array; my @remove_duplication = keys %hash;
还有个例子也很好,计算文件的大小,是一个grep和map使用的例题,如输出文件列表@array中小于1000字节的文件
print map {"$_\n"} grep {-s < 1000} @array;
还有看到用map来设置随机8位数密码的,非常简洁!
@number = (0..9, "a".."z"); $password = join ("", map{$number[int rand($#number+1)]}0..7)
sort操作符
Sort是一种很常用的操作符,主要对列表进行排序,默认是按照ASCII顺序进行排序。perl会调用自己的排序子程序对列表进行排序,所以代码很简单
按照默认排序对%hash的键进行排序
sort keys %hash
按照数值大小进行排序,如果从小到大
my @result = sort {$a <=> $b} @array;
上述按照递减形式进行排序,有两种方式
my @result = reverse sort {$a <=> $b} @array; my @result = sort {$b <=> $a} @array;
按照字符串进行排序
my @result = sort {$a cmp $b} @array;
对%hash的值进行排序
my @out = sort {$hash{$a} <=> $hash{$b}} keys %hash;
多级排序,如先对%hash的值按照从小到大排序,然后再按照@array的元素按照字符串进行排序
my @out = sort { $hash{$a} <=> $hash{$b} or $a cmp $b; }@array
本文出自于http://www.bioinfo-scrounger.com转载请注明出处