PERL程序员读书笔记

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

MachdeBaguaPerl-grepmach发表于2007年06月22日00:43|永久链接|评论(2)Perl的grep,实在是与map有太多类似之处,就一起做了笔记吧。1.grep语法grepBLOCKLISTgrepEXPR,LIST看起来和map的一模一样是吧。。。事实上grep也是把LIST里面的元素逐个取出放到$_里面。然后把$_代入BLOCK去计算一个逻辑表达式,当表达式为真的时候,$_进入结果列表。否则就被过滤掉了。2.利用正则表达式作统计假设你是一位简奥斯汀迷。。。现在你想统计她的某篇小说有多少行出现过单词hence,let'sstart!my$FILE;unless(open($FILE,/home/book/literature/UK/JaneAusten/Emma.txt)){return0;}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;这个世界上有很多grepfans,创建了很多让人惊讶的grep用法,有一些很艺术化了,就不说那么远了。我个人并不太偏好使用grep,这里介绍一篇@|^|`(这个logo是一头牛)的网站上结合使用grep和map的例子的幻灯片:Usingmapandgrep.最后。。。有没有觉得最近两篇blog太枯燥?说个无关的好消息:Shakespear大师的著名问题Tobeornottobe,thatisaquestion.已经有解了!答案就是FF!真的,解题过程就在这里0x2B|~0x2B=0xFF。分类SoftwareMachdeBaguaPerl-mapmach发表于2007年06月21日23:39|永久链接|评论(0)因为我写的perl代码都有可能因为追求性能而用C改写,所以很多时候都有意识地不去用perl的一些特有功能,其中就有功能强大的map。如果是魔法门英雄无敌的玩家,就很容易理解什么是map.在英雄无敌里,当英雄的魔法技能达到专家级别时,可以使用一些群体魔法,例如土系的群体减速、气系的群体加速、群体气盾、连环闪电、火系的大火球和流星雨等。可是相应的魔法系的等级未到之前,就只能很委屈地对单个生物使用魔法。Perl里面的map,是一种道具,可以让你的魔法,哦不,是函数或者表达式,很方便地施用到一系列对象上去。1.让我们先看map的语法mapBLOCKLISTmapEXPR,LISTBLOCK是一个用{}包围的代码块。EXPR可以是子函数名、正则表达式等。LIST是输入列表。简单地说,map就是起了一个替代foreach循环的作用,map会把数组LIST中的元素挨个取出,放到系统变量$_中,然后调用BLOCK去处理。值得强调的是,除非有很特殊的理由,不要去修改$_的值,因为修改$_就是直接改了原始数组里的元素!BLOCK处理过的结果由map返回,仍然是一个数组。2.一个例子:计算一系列文件大小my@sizes=map{-s$_}@filenames;上面例子用-s操作取得一些文件的大小,存到数组中去。3.是不是说map函数的输入数组和输出数组一定等长呢?不一定的,看这个my@books=('PrideandPrejudice','Emma','MasfieldPark','SenseandSensibility','NothangerAbbey','Persuasion','LadySusan','Sanditon','TheWatsons');现在取出书名里面所有用到的单词,并且全部转换成大写my@words=map{split(/\s+/,$_)}@books;my@uppercases=mapuc,@words;在split起过作用之后,当然@words的长度要比@books长了。4.再举一个map嵌套使用的例子:矩阵的转置useData::Dumper();my@matrix=([a,b,c,d],[e,f,g,h],[i,j,k,l]);printDumper(\@matrix);my@transposed=map{$x=$_;[map{$matrix[$_][$x]}0..$#matrix];}0..$#{$matrix[0]};printDumper(\@transposed);上面的BLOCK里面,map的返回值是用方括号操作符号构造匿名数组实现的。理解这一点就容易看懂代码了,这个匿名数组法常常被用来构造简单难懂的代码,常用伎俩:-)分类SoftwareMachdeBaguaCombineeval()withData::Dumpermach发表于2007年04月12日12:03|永久链接|评论(0)CombineevalwithData::Dumpereval()isapowerfulfunctioninPerl,whichislikeavirtualmachinetoexecutetheinputstring.Peopleoftenutilizeitasadynamiccodingfeature.Data::DumperisapopularCPANmoudule,whichstoresthecontentsoftheinputreferenceintoastring.Manycameralfriendsuseittohelpdebugging.WhatwillhappenifIcombinethosepopularfunctionstogether?Youcanstorethecontentsofyourhash(notlimitedtohash,alsoarray,string)toafile,ansalsogetthecontentsbackeasily!Let'sstart.#!/usr/bin/perlusestrict;useData::Dumper;#constructacomplexhashmy%hash;@{$hash{'color'}}=('red','green','blue','yellow','cyan','magenta','coral','silver');%{$hash{'event'}}=('BachChamberMusicFestival'='2007-04-13','ShanghaiInternationalAutomobileExhibition'='2007-04-24','MusicofOnoLisa'='2007-05-04');$hash{'updated'}='2007-04-12';#savehashtoafile'log'my$FHANDLE;unless(open($FHANDLE,'log')){exit-1;}print$FHANDLEDumper(\%hash);close$FHANDLE;Nowlet'scheckthefile'log'.Itshouldlooklikethis:$VAR1={'color'=['red','green','blue','yellow','cyan','magarnet','coral','silver'],'updated'='2007-04-12','event'={'BachChamberMusicFestival'='2007-04-13','MusicofOnoLisa'='2007-05-04','ShanghaiInternationalAutomobileExhibition'='2007-04-24'}};#readhashfromfilemy%hashNew;unless(open($FHANDLE,'log')){exit-2;}my@array=$FHANDLE;close$FHANDLE;my$VAR1;#mustdefinethiswhileitshowsinlogfile%hashNew=%{eval(join('',@array))};if($@){printSyntaxerror:$@;exit-3;}#showthehashreadprintDumper(\%hashNew);分类SoftwareMachdeBaguaPerl正则表达式(RegularExpression,regex)mach发表于2007年03月23日20:49|永久链接|评论(3)如果要问我Perl语言的优点,我会说有三个半。前三个是正则表达式、哈希、引用,那半个是Map,因为还不大会用,不太说得出它的秒处,所以算半个。其实哈希、引用、Map都算是数据结构的范畴;正则表达式和它们差异比较大。人类的思维里有很多正则表达式的痕迹,甚至用这种方式训练下一代。比如一位完全文科思维的幼儿园教师,也会教育她的学生从一桶积木里找出一个红的方块来。红而且方的积木,这就是一个自然语言的正则表达式。正则表达式也经常被称为模式,用来描述或者匹配一系列符合某个句法规则的字符串。一定有人还记得在dos和Unix下面的这些命令:$ls-limg1?.jpgC:dir*.exe这里的星号通配符和问号通配符就是正则表达式符号,确切地说是Dosshell和Unixshell使用的正则表达式符号。Perl的正则表达式规则与这两些shell的都有所不同,但Perl的正则表达式影响最大,几乎成了业界标准,以至于近年来新建的一些计算机语言都要申明自己实现了Pcre(Perl兼容的正则表达式),要不然都不好意思出来混江湖(微软除外)。Perl正则表达式的使用很简单(其实实现起来很难),跟我来:1.Perl正则表达式相关的操作符先不说正则表达式本身,下面我们的正则表达式就用apple.先定义一个字符串my$szProductType=applecider;现在要检验它里面有没有字符串apple。if($szProductType=~/apple/){print$szProductType.\n;}上面的=~要看做一个符号,是Perl的正则表达式匹配操作符。这个符号匹配成功返回1,否则返回0。后面的两个/之间包括的就是正则表达式,这是就是apple。正则表达式也可以不用/符号而改用其它符号包括,鉴于海马一向厌恶这种标新立异做无用功的行为,就不说怎么操作了,偏执到不喜欢/符号的人请自己去查Perl手册吧。如果要求匹配一个字符串里面没有apple怎么办?当然可以这样(花括号里该写什么自己写吧,我省略啦)unless($szProductType=~/apple/){}还可以这样if(!($szProductType=~/apple/)){}但是,为了表示你很懂Perl,你应该这样,这也是我最喜欢的方式(画外音:这和前面那个被批判的标新立异有啥区别,嗯?),使用不匹配操作符号!~。if($szProductType!~/apple/)){}最后,为了避免被人看穿自己很不懂Perl,看到下面的表达式的时候千万不要露怯if($szProductType!~m/apple/)){}这个m是干什么的?答案是,这个地方有m没m一样的,都是表示匹配(match)。请直接无视之。对于匹配操作符也是一样的情况。2.Perl正则表达

1 / 106
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功