Perl学习笔记 grep|map|sort操作符

来源:互联网 时间:2017-11-23


入门书籍: Perl语言入门 ,Perl进阶


grep操作符

grep操作符可以通过表达式or块形式,将列表中的每个元素按照顺序依次取出,然后根据一定形式对其求值,最后将满足条件的元素赋值于某个列表。


在不了解grep操作符之前,如果想对列表中的元素进行处理提取符合要求的元素时,通常只能用foreach循环列表,但这样是不效率的做法。


取出数组@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
转载请注明出处


相关阅读:
Top