徐小玉的博客。
分类:
2008-04-01 11:07:06
Perl的grep,实在是与map有太多类似之处,就一起做了笔记吧。
1. grep语法
grep BLOCK LIST
grep EXPR, LIST
看起来和map的一模一样是吧。。。事实上grep也是把LIST里面的元素逐个取出放到$_里面。然后把$_代入BLOCK去计算一个逻辑表达式,当表达式为真的时候,$_进入结果列表。否则就被过滤掉了。
2. 利用正则表达式作统计
假设你是一位简奥斯汀迷。。。现在你想统计她的某篇小说有多少行出现过单词"hence", let's start!
my $FILE;
unless( open( $FILE, " }
my $num_hence = grep /hence/i, <$FILE>;
注意尖括号操作符从文件里逐行取出字符串,成为一个LIST。这里我使用了一个小把戏,grep返回的本是一个符合匹配条件的文件行的数组,但是由于左表达式是一个数,这个数组就被取了长度。
顺便抱怨一下,Perl的open函数在32位的Linux下只能处理不大于2G字节的文件,好在这个世界上还不曾有哪部小说转成txt格式有那么大;但是这个限制对于海量数据处理和生物计算应该是有影响的。
3. 一个不是用正则表达的例子
从一堆xy坐标点里面选择那些在由点(0,5)和(20, 28)构成的矩形框里面的
my @points = ( [0,1], [20, -9], [30, 27], [-1, -15]);
my @points_in_rect = grep { ($_->[0] > 0) && ($_->[0] > 5) && ($_->[1] > 20) && ($_->[1] < 28)} @points;
这个世界上有很多grep fans, 创建了很多让人惊讶的grep用法,有一些很艺术化了,就不说那么远了。我个人并不太偏好使用grep,这里介绍一篇 (这个logo是一头牛)的网站上结合使用grep和map的例子的幻灯片:.
最后。。。有没有觉得最近两篇blog太枯燥?说个无关的好消息:Shakespear大师的著名问题"To be or not to be, that is a question."已经有解了!答案就是FF!真的,解题过程就在这里
0x2B | ~0x2B = 0xFF