什么是Perl?编程语言Perl详细介绍
Perl最初的设计者为拉里·沃尔(LarryWall),它于1987年12月18日发表。Perl借取了C、sed、awk、shellscripting以及很多其他程序语言的特性。LarryWall在新闻组comp.sources.misc发布了Perl脚本语言1.0版,当时他是Unisys公司的一名程序员。Perl借鉴了sh、Awk和Sed等脚本语言的特性,试图成为一个能简化报告处理的通用Unix脚本语言。
Perl2在1988年发布,增加了更多特性,拥有更好的正则表达式引擎。Perl3和Perl4分别在1989年和1991年发布,而1994年发布的Perl5则是最重要的一个版本,至今仍在开发中。2000年启动的Perl6则完全重写了Perl,基于不同的原则,开发者决定先制定语言规格。Perl6的发布日期被认为是圣诞节,但没有指定哪一年的圣诞节。Perl5公布了16个版本,Perl5.6在2000年发布,Perl5.8的持续开发贯穿了2002-08年,5.10在2007年发布,5.12在2010年发布,此后 Perl开始采用每月发布一个版本每年发布一个稳定版本的发布周期,5.14在2011年发布,5.16于2012年发布。
Perl一般被称为“实用报表提取语言”(PracticalExtractionandReportLanguage),虽然有时被称做“病态折中垃圾列表器”(PathologicallyEclecticRubbishLister)。它是术语,而不仅仅是简写,Perl的创造者,LarryWall提出第一个,但很快又扩展到第二个。那就是为什么“Perl”没有所有字母都大写。没必要争论那一个正确,Larry两个都认可。你也可能看到“perl”,所有的字母都是小写的。一般,“Perl”,有大写的P,是指语言本身,而“perl”,小写的p,是指程序运行的解释器。Perl的正式网站是www.perl.org。
Perl的特点
Perl的解释程序是开放源码的免费软件,使用Perl不必担心费用,Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移。
Perl是一种能完成任务的语言。从一开始,Perl就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。它可以很容易操作数字、文本、文件和目录、计算机和网络、特别是程序的语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西,而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理,当然这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行。
Perl基本语法
标量定义,以$号开头,如:$num=1;
数组定义,以@开头,如:@array=(1,2,3);
数组元素调用@array[index],其中index表示数组下标,如上例,@array[0]的值是1
散列定义,以%开头,如:%hash=("a",1,"b",2);
散列调用%hash,其中key表示键值,如上例,%hash{"b"}的值是1
Perl的哲学
Perl追求的是简单,解决一个一般的问题用它几行代码就完成了.一个稍复杂一点的问题代码也不会超过一屏!事实上,大多数人用Perl写的程序大多都没超过100行.
Perl最初是当做一种Unix的胶水语言设计的,但是她早就移植到大多数其它操作系统里了。因为Perl几乎可以在任何地方运行,所以Perl可以说是当今最具有移植性的编程环境。要想写可移植的C/C++程序,你得在程序里加上一大堆#ifdef标签来区分不同的系统。要想写可移植的Java程序,你必须理解每种新的Java实现的特质。要想写可移植的shell,你可能要记住每条命令在每种操作系统上的语法,走运的时候你可能可以找到一些公共的东西。而要想写可移植的VisualBasic程序,那么你只需要对“移植”有个更灵活的定义就可以了。
我们很高兴的是Perl避免了所有这些问题,同时还保留了这些语言中的许多优点,同时还有一些自己的特色。Perl的特色来自许多方面:它的特性集的工具,Perl社区的创造性,以及开源运动的大环境。不过,许多这些特性都是混合的东西;Perl的身世复杂,它总是把事物看成是优点的不同方面,而不是弱点。Perl是“背黑锅我来”的语言。如果你觉得自己陷入一团乱麻之中,非常渴望自由,那么请使用Perl。
Perl是跨文化的。Perl的爆炸性增长很大程度上是因为那些前Unix系统程序员的渴望,他们希望从他们的“老家”带着尽可能多的东西。对于他们而言,Perl是可移植的Unix文化蒸馏器,是"此路不通"的沙漠中的绿洲。从另外一个角度来看,Perl还可以从另外一个方向运转:在Windows上工作的web设计者通常会非常开心地发现他们的Perl程序可以不加修改地在Unix服务器上跑。
尽管Perl在系统程序员和web设计师中间非常流行,但这只是因为是他们最早发现Perl的,Perl可以用于更广泛的用途。从Perl最早的文本处理语言开始,它已经发展成为一种非常复杂的,通用的编程语言,以及完整的开发环境,包括调试器、调节器、交叉引用、编译器、库、语法提示编辑器,以及所有其它“真正”的编程语言所具有的所有挂勾,只要你需要。当然这些东西都是让我们可能处理难的问题的东西,而且很多其它语言也可以做到这一点。Perl之所以成为Perl是因为它从来不会因为保持简单事情简单化而丢失其他方面的特性。
因为Perl既强大又好用,所以它被广泛地用于日常生活的方方面面,从宇航工程到分子生物学,从数学到语言学,从图形处理到文档处理,从数据库操作到网络管理。很多人用Perl进行快速处理那些很难分析或转换的大批量数据,不管你是处理DNA序列、网页、还是猪肚皮的未来都无所谓。实际上,在Perl社区有一个笑话就是,下次股市大崩盘就很有可能是呢个家伙写的脚本里头有臭虫造成的。(不过,乐观点来看就是,任何还在失业的股票分析师仍然有可以利用的。)
Perl的成功有许多原因。Perl早在开源软件的名字出现之前就已经是一个成功的开源项目了。Perl是自由的,并将永远自由下去。你可以在任何合适的场合使用Perl,只需要遵守一个非常自由的版权就可以了。如果你在从事商业活动并且还想使用Perl,那么用就是了。你可以把Perl嵌入到你写的商业软件中而不需要支付任何费用也没有任何限制。如果你碰上一个Perl社区解决不了的问题,那你也还有最后的一招:源程序本身。Perl社区不会在“升级”的伪装下租给你它们的商业秘密,而且Perl社区也不会“停业”,更不会让你孤立无援。
Perl是自由软件这一点无疑对它是有帮助的。但这一条并不足以解释Perl现象,因为许多自由软件包没有能繁荣起来。Perl不仅自由;而且好玩。人们觉得自己在Perl里可以有创造力,因为它们有表达的自由:他们可以选择是为计算机速度优化还是为程序员的速度优化,是冗长还是简洁,是选择可读性还是可维护性,或者选择复用性、移植性、接受性和传授性等等。假如你进入一次模糊的Perl比赛,甚至你还可以为模糊性做优化。
Perl可以给予你所有这些自由,因为它是一门有着分裂人格的语言,Perl同时是很简单并且很富有的语言。Perl从其它地方拿来好主意,然后把它们安装到易用的框架里面。对于只是喜欢她的人来说,Perl是实用抽取和报表语言(PracticalExtractoinandReportLanguage)。对那些热爱她的人而言,她是变态电子垃圾制造者(PathologicallyElectricRubbishLister)。在少数人眼里,Perl是毫无意义的重复练习,不过世界需要一点点冗余,精简主义者总是想把事物分隔开,而我们则总是企图把它们合并到一起。
Perl之所以是简单的语言是有很多原因的。比如你用不着知道什么特殊的指令就可以编译Perl程序--只要把它当做批处理或者shell脚本执行就可以了。Perl的类型和结构很容易使用和理解。Perl对你的数据没有任何限制--你的字串和数组可以要多长就多长(只要你有足够的内存),而且它们都会自动增长。Perl不会强迫你学习新的语法和语意,Perl改从许多其它你已经熟悉的语言里(比如C、awk、BASIC和Python、英文、希腊语等)借来语法。实际上,任何程序员都可以从书写良好的Perl代码段中读懂它的含义。
最重要的是,你不用先学习所有Perl的东西就可以开始写有用的程序。你可以写很小的Perl程序。你也可以象小孩那样写Perl程序,我们保证不会笑话你。或者更准确地说是,我们绝不会笑话小孩做事情的创造性。Perl里的许多观点都是从自然语言中借来的,其中一条最好的观点就是只要你能把自己的意思表述清楚,那么你就可以使用这些语言的一个子集。Perl文化可以接受任何熟练程度的成员。我们不会在你背后放个语言警察。如果你的老板不炒你,而且你的Perl脚本也能完成工作,那么它就是“正确”的。
尽管Perl很简单,但它仍然是一种特性很丰富的语言,如果你想用那些特性的话,那你就要学习一些东西,这也是把难题变简单的学费。虽然你要想把所有Perl能做的事情吸收还需要一些时间,但到你需要这些功能的时候你就会非常开心地发现Perl已经可以做这些事情了。
由于Perl的继承性,就算它只是用做数据归纳语言的时候也有丰富的特性,Perl一开始就设计成可以浏览文件,扫描大量文本并且生成动态数据以及打印出这些数据的良好格式化的报表。不过,随后Perl就开始风行,于是它就成了可以操作文件系统、进程管理、数据库管理、进行C/S编程和安全编程、web信息管理、甚至可以进行面向对象和面向功能的编程的语言。而且这些功能并非只是在Perl这边,每种新功能都和其它东西交流得很好,别忘了Perl从一开始就是设计成胶水语言的。
而且Perl并不仅仅只能黏合它自己的特性。Perl是设计成可以用模块扩展的语言。你可以用Perl快速设计,编写,调试和部署Perl应用,并且你还可以在需要的时候很方便地扩展这些应用。你可以在其它语言里嵌入Perl,而且你也可以在Perl里嵌入其它语言。通过模块输入机制,你可以把这些外部的扩展当做内置于Perl的特性。那些面向对象的外部库在Perl内部仍然保持面向对象的特征。
Perl还在许多其它方面协助你。和严格的每次执行一条命令的命令文件和shell脚本不同的是,Perl先把你的程序快速编译成一种内部格式。和其它任何编译器一样,这个时候还进行各种优化,同时把碰到的任何问题反馈给你。一旦Perl的编译器前端对你的程序表示满意了,它就把这些中间代码交给解释器执行(或者是给其它的能生成C或者字节码的模块后端)。听起来挺复杂,不过Perl的编译器和解释器干这些活效率相当高,我们的编译-运行-修改的过程几乎都是以秒计。再加上Perl的许多其他开发特性,这种快速的角色转换很适合做快速原型设计。然后随着你的程序的成熟,你可以逐步拧紧身上的螺母,减少散漫增强记律。如果你做得好,Perl也能帮你这个忙。
Perl还可以帮你写更安全的程序。除了其它语言提供的典型的安全接口之外,Perl还通过一种跟踪数据的机制给你提供预防意外安全错误的保护,这样就可以在灾害发生之前预防其发生。最后,Perl还可以让你设置一个特殊的防护隔段运行那些来源不明的Perl代码,以此来杜绝危险操作。
不过,偏执一点儿说,Perl帮你的大部分内容和Perl本身没有什么关系,而是和使用Perl的人有关。坦率地说,Perl社区的人们可以说是地球上最热心的人了。如果Perl运动里面有那么一点点宗教色彩的话,那么这就是它的核心了。Larry希望Perl社区像一小片天堂那样运转,目前看来他的愿望基本上是实现了。我们也请你为此做出自己的努力。
Perl之所以强大,是因为有CPAN,CPAN上面有无数的开源模块,从科学计算到桌面应用到网络等等各个方面都有大量的模块!并且现在世界上也还有无数的人在向上面添加模块!如果你想要用PERL实现某功能,不用自己做,在CPAN上面搜一搜,多半都会得到已有的结果!CPAN("theComprehensivePerlArchiveNetwork"全面的Perl存档网络)是查找任何Perl有关的东西的中心仓库。它包含从整个Perl社区收集来的智慧:成百上千的Perl模块和脚本,相当于好几本书的文档,以及整个Perl发布。如果有东西是用Perl写的,而且这个东西很有用而且是自由的,那么它很有可能就在CPAN上。CPAN在全世界都有镜象,你可以在位于http://www.perl.com/CPAN的CPAN路牌上找到离你最近的镜象。那块路牌会记住你选择的是哪个镜象并且你以后再访问http://www.perl.com/CPAN/(注意最后的斜杠)的时候就会自动重新定向到那个镜象。另外,你也可以从www.cpan.org开始。这个站的界面不同,但是数据是一样的。
Perl文化
1.时势造英雄
为了理解Perl为什么用现在这样的样子定义(或者为什么不定义成其他的样子),我们必须首先明白为什么会有Perl。所以,让我们先挖掘一下步满尘灰的历史书....
退回到1986年,Larry是一个系统程序员,在做一个多层安全的广域网项目的开发。他负责这么一个系统,这个系统由西海岸的三台VAX和三台sun机器,通过一条加密了的1200波特的串行线路和东海岸类似配置的系统连接组成的,因为Larry的主要工作是支持(他不是该项目的程序员,只是系统专家),所以他就有机会利用他的三种优点(懒惰,不耐心,和狂傲)来开发和提高所有有用的工具——比如rn、patch和warp。(注:正是在这个时候,Larry被划入了“计算机动物”的范畴,这是以那些人的不可遏止的“再加一个特性”的渴望为基础评判的,因为这种行为几乎成了生物必须。毕竟,如果生活就是太复杂的话,难道程序就不会吗?尤其是想rn这样的程序,它真是应该当作一个高级的人工智能项目来看待,因为他们就可以为你阅读新闻。当然,有些人已经在说patch程序太复杂了。)
一天,Larry刚刚把rn撕成碎片,把它一片一片地放在他的目录里,大管理员就跑进来说,“Larry,我们需要一个管理配置,用它控制所有六台VAX和六台sun。我们想在一个月里就要它,你做一个吧!”
所以,从不逃避工作的Larry,开始问自己做一个两个海岸的CM系统的最好的方法是什么,它必须不用自己从头开始写,并且还可以查阅两个海岸的问题报告以及核准和控制。他想到的答案只有一个词:B-news。(注:也就是Usenet传输软件的第二种实现。)
Larry着手在这些机器上安装了新闻软件并且增加了两条控制命令:一条“append”命令用于向现有的文章追加内容,和一条“synchronize”命令保持两个海岸的文章数目相同。CM可以用RCS(版本控制系统)做,而核准和控制可以用新闻和rn来做。到目前挺好。
然后大管理员让他生成报告。新闻是在核心机器里的一个独立的文件里维护的,里面有许多文件间的交叉引用。Larry的第一个反应是“用awk。”糟糕的是,那个时候的awk无法做到以文件里的信息为基础打开和关闭多个文件。Larry不想编写一个特殊目的的工具,结果就是产生了一种新的语言。最初这种新的语言并不叫Perl。Larry和他的同事及亲友(DanFaigin,写这段历史的人,和MarkBiggar,他的妻弟,在初始设计阶段帮了大忙)交换了一大堆名字。实际上Larry考虑并抛弃了字典里的所有三个或四个字母的单词。最早的名字是“Gloria”,以他的宝贝(和老婆)命名,但他很快就发现这样会产生太多家庭混乱。
然后名字就成了“Pearl”,最后它变成了我们现在的“Perl”,部分原因是Larry看到另外一种叫PEARL的语言的介绍,但最主要的原因是他懒得总要敲五个键。当然,这样Perl就可以用做一个四字母的词。(不过,你会注意到,这里有以前首字缩写的残余:“PracticalExtractionAndReportLanguage”。)
最早的Perl没有今天的Perl那么多的特性。那时候有模式匹配和文件句柄、有标量、有格式化,但是很少有函数,没有相关的数组,而且只有一个实现得不怎么样的正则表达式(从rn借来的)。手册页也只有15页。但是Perl比sed和awk快,并且开始在该项目的其他应用里使用。
但是其他地方又开始需要Larry了。有一天另外一个大经理来了并且说:“Larry,给R&D做支持。”并且Larry说,好吧。他带上Perl并且很快发现它逐渐成为系统管理的好工具。他借来HenrySpencer漂亮的正则表达式软件包并且把它变成更有男人味(不过Henry可能不会愿意在正餐的时候考虑这些特性。)然后Larry增加了大部分他想要的特性,以及一些别人想要的特性。然后它就把Perl发布到网络上。(注:更让人吃惊的是,他先后工作于喷气推进实验室(JPL),然后是NetLabs和Seagate之后,仍然不断发布新Perl。现在,其他人做了大部分工作,而Larry假装为O'Reilly&Associates(一个小公司,印刷关于计算机和相关事物的小册子。)其余的就是历史了。(注:而这些东西,是历史的一个注解。当开始Perl的工作的时候,Larry已经把rn分解成碎片,并且准备做一次全面的重写。但因为他开始在Perl上干活,所以Larry没有再碰rn,它仍然是碎片。有时候Larry说要用Perl重写rn,但是从来没当真。)
然后事情的发展就是这样的:Perl1.0在1987年十二月十八日发布;有些人仍然很认真地对待Perl的生日。Perl2.0在1988年六月发布,并且RandalSchwartz开始了“另外一个Perl黑客”的签名的传奇。在1989年,TomChristiansen在巴尔的摩Usenix拿出了第一个公开的Perl教程。1989年十月的Perl3.0开始,这门语言第一次以GNU公众版权(GPL)发布和分发。
1990年三月,Larry写了第一首Perl小诗(见下一节)。然后他和Randal写了本书的第一版,ThePinkCamel;该书在1991年早期发行。然后Perl4.0就立即发布了;除GPL之外,它还包括了ArtisticLicense(艺术版权)。
万众期待的Perl5在1994年十月发布。这是一个完全重写的Perl版本,它包括对象和模块。Perl5的到来甚至连TheEcomomist杂志都提到。到了1995年,正式向Perl社区引入CPAN。在1996年,JonOrwant开始出版ThePerlJournal杂志。在长时间的猜测之后,本书的第二版,TheBlueCamel,在那年的年末出版。第一次O'ReillyPerl大会(TPC)1997年夏季在加州SanJose举行。现在,重大时间几乎是每天都在发生,所以关于历史的其他部分,请检查CPAST(ComprehensivePerlArcanaSocietyTapestry(history.perl.org))上的Perl纪年表。
2.Perl诗歌
在助手框里的诗歌的仿制品是在1990年的四月一日愚人节张贴到Usenet上的。我们不加注释的把它放在这里,只是想表示典型的编程语言的隐喻真的是多么让人作呕。对所有有文学价值的东西大概都是这样的吧。Larry在最初为Perl3写的那些“BlackPerl”到了Perl5不能分析通过之后,真是感觉轻松许多。
不过,Larry自己的文集很幸运地被Perl诗歌的王后,SharonHopkins的光芒所掩盖。她写了相当多的Perl诗歌,以及一些她在1992年Usenet冬季技术大会上拿出来的关于Perl诗歌的文章,标题是“CamelsandNeedles:ComputerPoetryMeetsthePerlProgrammingLanguage”。(这篇文章可以在CAPN的misc/poetry.ps找到。)除了是最多产的Perl诗人之外,Sharon还是下面这首诗歌的作者,这首诗是发表得最广泛的一首,并且曾经在Economist和Guardian杂志上刊登:
#!/usr/bin/perl APPEAL: listen(please,please); openyourself,wide; join(you,me), connect(us,together), tellme. dosomethingifdistressed; @dawn,dance; @evening,sing; read(books,$poems,stories)untilpeaceful; studyifable; writemeif-you-please; sortyourfeelings,resetgoals,seek(friends,family,anyone); do*not*die(likethis) ifsinabounds; keys(hidden),open(locks,doors),tellsecrets; donot,I-beg-you,closethem,yet. accept(yourself,changes), bind(grief,despair); requiretruth,goodnessif-you-will,eachmoment; select(always),length(of-days) #listen(aperlpoem) #SharonHopkins #rev.June19,1995 PerlPoetry Article970ofcomp.lang.perl: Path:jpl-devvax!pl-dexxav!lwall From:lwall@jpl-dexxav.JPL.NASA.GOV(LarryWall) Newsgroups:news.groups,rec.arts.poems,comp.lang.perl Subject:CALLFORDISCUSSION:comp.lang.perl.poems Message-ID: Date:1Apr9000:00:00GMT Reply-To:lwall@jpl-devvax.JPL.NSAS.GOV(LarryWall) Organization:JetPrepulsionLaboratory,Pasadena,CA Lines:61
Ithascometomyattentionthatthereisacryingneedforaplaceforpeopletoexpressboththeiremotionalandtechnicalnaturessimultaneously.Severalpeoplehavesentmesomeitemswhichdon'tfitintoany newsgroup.Perhapsit'sbecauseIrecentlypostedtobothcomp.lang.perlandtorec.arts.poems,butpeopleseemtobewritingpoemsinPerl,andthey'reaskingmewheretheyshouldpostthem.Hereisasampling: Fromagraduatestudent(infinalsweek),thefollowinghaiku:
study,write,study, doreview(eachword)iftime. closebook.sleep?what'sthat? AndsomeonewritingfromFortLauderdalewrites: sleep,closetogether, sortofsineachspring&wait; 50%die Apersonwhowishestoremainanonymouswrotethefollowingexampleof"BlackPerl". (ThePearlpoetwouldhavebeenshocked,nodoubt.)
BEFOREHAND:closedoor,eachwindow&exit; waituntiltime. openspellbook,study,read(scan,select,tellus); writeit,printthehexwhileeachwatches, reverseitslength,writeagain; killspiders,popthem,chop,split,killthem. unlinkarms,shift,wait&listen(listening,wait), sorttheflock(then,warnthe"goats"&killthe"sheep"); killthem,dumpqualms,shiftmoralities, valuesaside,eachone; diesheep!dietoreversethesystem youaccept(reject,respect); nextstep, killthenextsacrifice,eachsacrifice, wait,redoritualuntil"allthespiritsarepleased"; doit("astheysay"). doit(*everyone***must***participate***in***forbidden**s*e*x*). returnlastvictim;packagebody; exitcrypt(time,times&"halfatime")&closeit, select(quickly)&warnyournextvictim; AFTERWORDS:tellnobody. wait,waituntiltime; waituntilnextyear,nextdecade; sleep,sleep,dieyourself, dieatlast
Itriedthat,anditactuallyparsesinPerl. Itdoesn'tappeartodoanythinguseful,however. IthinkI'mglad,actually...Iherebyproposethecreationofcomp.lang.perl.poemsasaplaceforsuchitems,sowedon'tcluttertheperlorpoemsnewsgroupswiththingsthatmaybeofinteresttoneither. Or,alternately,weshouldcreaterec.arts.poems.perlforitemssuchasthoseabovewhichmerelyparse,anddon'tdoanythinguseful. (Thereisprecedentinrec.arts.poems,afterall.) Thenalsocreatecomp.lang.perl.poemsforpoemsthatactuallydosomething,suchasthishaikuofmyown:
printSTDOUTq JustanotherPerlhacker, unless$spring
LarryWall lwall@jpl-devvax.jpl.nasa.gov