perl总结(4)--grep和map

1) 介绍

2) grep - 过滤数组

3) map - 对数组中的内容做批量处理

4) "grep"和"map"的相似之处

5)一些相关例子

             --------------------------------------------------------------------------------------

1) 介绍

    之前介绍过perl中的一个利器:正则表达式。它在处理文本时非常简洁实用,而我觉得perl中还有两个不得不说到的函数是“grep”和“map”,其在处理数组相关的问题时,特别强大和好用。其实在某个角度上来说,这两个函数都不能称之为函数,因为他们具备了近似操作符的功能。“grep”和“map”的使用太灵活,以至于这里我只能简单介绍一下它们的用法,举一些小例子,希望大家能对它们有一定了解。

             --------------------------------------------------------------------------------------

2) grep

        一句话概括“grep”函数的功能就是:它对数组内的元素进行筛选,挑选出其中符合一定条件的元素组成新的数组返回。

       grep语法

       grep BLOCK LIST
       grep EXPR, LIST

        使用例子如:

   @positive_numbers = grep($_ > 0, @numbers);

    可以在上例上看到,每个数组的元素都被记作"$_".这一点让你可以写出类似于Unix中“grep”的命令。又如:

   @non_blank_lines = grep /\S/, @lines;

    而且这里,grep后面还可以接由花括号括起来的一块代码段,而不是简单的一条条件语句。

   @non_blank_lines = grep { /\S/ } @lines;     # 和上例是一样的

    上面的例子体现不出差别,但是代码块在你想写非常复杂的过滤条件(多条语句才能描述清楚)时是非常有用的。特别注意,这里代码块的返回结果其实是最后一条语句执行完后的结果。如下例:

   # 所有的正数都可以作为指数使用

   # 而负数只能在其为负整数的时候这样使用.

   @can_be_used_as_exponent = grep {

     if ( $_ < 0 ) {

       ! /\./;          # 不含小数点.

     }

     else {

       1;               # 总是为真

     }

   } @array;

             -------------------------------------------------------------------------------------

3) map

    “map”函数的功能是,对一个数组内的元素都做某个变换操作,之后得到一个新的数组返回。

     map  BLOCK  LIST

     map  EXPR,    LIST

     BLOCK是一个用{}包围的代码块。EXPR可以是子函数名、正则表达式等。LIST是输入列表。


   这里需要注意的是,一般情况下原始的数组里面的元素并不会被改变(除非你对$_直接操作)。如下为一个例子:

   @lines_with_newlines = map( $_ . "\n", @lines_without_newlines);

    这里和上面介绍grep时一样,每个元素都被记作 "$_"。

    同样,“map”后也可接代码块,例如下例:

   # 替换"x @ y.z" 成"x at y dot z" 

   @disguised_addresses = map {

       my $email = $_;

       $email =~ s/\@/ at /;

       $email =~ s/\./ dot /g;

       $email;

     } @email_addresses;

    这个地方需要提一下的时候,注意尽量不要在$_上直接进行正则的替换,不然原始的数组会被改变。

             ------------------------------------------------------------------------------------

4)  "grep"和"map"的相似之处

    "grep"和"map"在很多地方非常相似,他们都需要一部分代码(不管这里是简单的一个语句还是一个代码块)作为输入条件参数(对了,如果是一条语句的话,中间是需要一个逗号作为分离的,如果是一个代码块,代码块之后不用逗号)。

     在“grep”和“map”中改变$_的值会改变原始数组中元素的值。但是我们看很多书籍或者程序员们都不鼓励大家这么做。

     这里需要提一下的是,在map中你千万不要使用"s///"。因为 "s///"操作符会改变"$_" 而不是返回一个结果,所以你不会得到你所需要的东西。(当然,显而易见,你不能再grep中使用它)。 

             ---------------------------------------------------------------------------------------

5)  一些相关例子

     例1:使用grep去除数组中重复元素


my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 ); 
my %count; 
my @uniq_times = grep { ++$count{ $_ } < 2; } @array; 

      这个例子很巧妙地利用count哈希记录数组中每个元素的频次,再使用grep进行筛选。

      例2:从一堆点中抽取符合一定条件的点

      例3:计算一系列文件的大小

      例4:利用map和sort进行排序



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值