请选择 进入手机版 | 继续访问电脑版
  • 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

perl总结(4)--grep和map

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1)介绍

2)grep-过滤数组

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

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

5)一些相关例子

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

1)介绍

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

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

2)grep

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

grep语法

grepBLOCKLIST
grepEXPR,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”后也可接代码块,例如下例:

#替换"[email protected]"成"xatydotz"

@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去除数组中重复元素


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

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

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

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

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




鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
perl安装CPAN模块发布时间:2022-07-22
下一篇:
perl在linux下通过date获取当前时间发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap