Perl - grep

| | 评论(2)

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, "</home/book/literature/UK/JaneAusten/Emma.txt")){ return 0;
}
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的例子的幻灯片:Using map and grep.

最后。。。有没有觉得最近两篇blog太枯燥?说个无关的好消息:Shakespear大师的著名问题"To be or not to be, that is a question."已经有解了!答案就是FF!真的,解题过程就在这里

0x2B | ~0x2B = 0xFF。

分类

评论(2)

owen :

my @points_in_rect = grep { ($_->[0] > 0) && ($_->[0] > 5) && ($_->[1] > 20) && ($_->[1] < 28)} @points;

??
你确定没有错?!

mach :

owen: 愿闻其详,我并不方便把真实代码贴出来的,这里贴的都是随手写的,不一定都跑得通

发表评论

关于此日记

此日记由mach发表于June 22, 2007 12:43 AM

此Blog上的上一篇日记Perl - map

此Blog上的下一篇日记端午入梅夏至

主索引归档页可以看到最新的日记和所有日记。

Powered by Movable Type 4.23-en