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

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

grep操作符

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

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

  1. 取出数组@array中大于2的元素

    my @result = grep {$_ > 10} @array;
    my @result = grep $_ > 10, @array;
    
  2. 不仅可以使用判断语句,还可以使用正则表达式,如从@input数组中取出1开头的数字

    my @out = grep /^1/, @input;
    
  3. 使用代码块(也就是N行代码,我是这么理解的),对数组输入的元素进行选择判断,最后输出通过条件的元素,比如判断@array数组中的元素在%hash中对应的键值是否能被2整除

    my @result = grep {
        my $in = $hash{$_};
        $in % 2;
    } @array
    

    从上可看出,只要满足条件,即输出是布尔值表达式也是可以的

  4. 上述代码写的通俗点就是

    my @result = grep {
        my $in = $hash{$_};
        if ($in % 2) {
            1;
        }else{
            0;
        }
    } @array
    
  5. 一个很常见的例子,去除@array数组中的重复元素

    my @uniq = grep {++$count{$_} < 2} @array;
    

map操作符

map操作符其实跟grep的类似的用法,但是从概念上稍微有点不一样。grep可以认为是筛选出符合条件的元素,不对元素对任何改变;而map则不一样,其可以将输入的元素进行转化,然后再输出。map操作符也有分表达式和块形式两者。

PS.最开始我即可就将map当做foreach来用的,可以说就是因为map比foreach少几个字母!!当然如果是复杂的块代码,而且是对N个数组以及其他数据结果进行操作的,并且不用考虑元素的最终输出,那么我觉得map代替foreach也未尝不可。

  1. 将数组@array中每个元素都加1

    my @result = map $_ + 1, @array;
    
  2. 将数组@array中元素作为%hash的键并赋值为1,这个在对@array中元素进行去重比较好用,而且代码也很简洁

    my %hash = map {$_, 1} @array;
    my @remove_duplication = keys %hash;
    
  3. 还有个例子也很好,计算文件的大小,是一个grep和map使用的例题,如输出文件列表@array中小于1000字节的文件

    print map {"$_\n"} grep {-s < 1000} @array;
    
  4. 还有看到用map来设置随机8位数密码的,非常简洁!

    @number = (0..9, "a".."z");
    $password = join ("", map{$number[int rand($#number+1)]}0..7)
    

sort操作符

Sort是一种很常用的操作符,主要对列表进行排序,默认是按照ASCII顺序进行排序。perl会调用自己的排序子程序对列表进行排序,所以代码很简单

  1. 按照默认排序对%hash的键进行排序

    sort keys %hash
    
  2. 按照数值大小进行排序,如果从小到大

    my @result = sort {$a <=> $b} @array;
    
  3. 上述按照递减形式进行排序,有两种方式

    my @result = reverse sort {$a <=> $b} @array;
    my @result = sort {$b <=> $a} @array;
    
  4. 按照字符串进行排序

    my @result = sort {$a cmp $b} @array;
    
  5. 对%hash的值进行排序

    my @out = sort {$hash{$a} <=> $hash{$b}} keys %hash;
    
  6. 多级排序,如先对%hash的值按照从小到大排序,然后再按照@array的元素按照字符串进行排序

    my @out = sort {
        $hash{$a} <=> $hash{$b} or
        $a cmp $b;
    }@array
    

本文出自于http://www.bioinfo-scrounger.com转载请注明出处