快好知 kuaihz订阅看过栏目

 







Perl是一种高级、通用、直译式、动态的程序语言。最初的设计者为拉里·沃尔(LarryWall),他于1987年12月18日发表。Perl借取了C、sed、awk、shellscripting以及很多其他程序语言的特性。其中最重要的特性是它内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便,被称之为“一种拥有各种语言功能的梦幻脚本语言”、“Unix中的王牌工具”。Perl一般被称为“实用报表提取语言”(PracticalExtractionandReportLanguage),你也可能看到“perl”,所有的字母都是小写的。一般,“Perl”,有大写的P,是指语言本身,而“perl”,小写的p,是指程序运行的解释器。

引言

Perl最初只是Unix系统管理员的一个工具,在工作日里被用在无数的小任务中。从那以后,它逐步发展成为一种全功能的程序设计语言,特别是在各种计算平台上,它被用作Web编程、数据库处理、XML处理以及系统管理——它能够完成所有这些工作,同时仍然是处理小的日常工作的完美工具,这是它的设计初衷。Perl快速、有趣,而且特别有用。很多人因为需要Perl而使用它,又因为热爱它而继续使用它。

Perl是一门自由且功能强大的编程语言。自1987年初次登台亮相以来,它的用户数一直急剧膨胀。从最初被当作一种在跨平台环境中书写可移植工具的高级语言开始,Perl就已经被广泛地认为是一种工业级的强大工具,可以在任何地方用来完成你的工作。Perl特别适合系统管理和Web编程。Perl实际上已经被所有Unix(包括Linux)捆绑在一起作为标准部件发布,而且也被广泛用于MicrosoftWindows和几乎所有其他操作系统。Amiga、BeOS、VMS、MVS和AppleMacintosh等也只是Perl已经完成移植的平台的一小部分。

概述

Perl原名pearl,但是在这个语言官方发表前,拉里·沃尔发现已经有个编程语言“pearl”,便将这个编程语言的名字改成Perl。对于Perl这四个字母,有一些解释,包括充满幽默感的“PathologicallyEclecticRubbishLister”。“PracticalExtractionandReportLanguage”曾经出现在很多有关Perl的数据里,包括官方的首页。不过事实上这个长名字是后来凑出来的。它的名字第一个字母大写(Perl)时就指这个编程语言,无大写字母(perl)时就指它的解释器。将Perl写成“PERL”是不适当的,因为它并非一个缩写字。

编程语言

Perl是由Larry Wall设计的,并由他不断更新和维护的编程语言。

Perl具有高级语言(如C)的强大能力和灵活性。事实上,你将看到,它的许多特性是从C语言中借用来的。

Perl与脚本语言一样,Perl不需要编译器和链接器来运行代码,你要做的只是写出程序并告诉Perl来运行而已。这意味着Perl对于小的编程问题的快速解决方案和为大型事件创建原型来测试潜在的解决方案是十分理想的。

Perl提供脚本语言(如sed和awk)的所有功能,还具有它们所不具备的很多功能。Perl还支持sed到Perl及awk到Perl的翻译器。

简而言之,Perl像C一样强大,像awk、sed等脚本描述语言一样方便。

特点

Perl的解释程序是开放源码的免费软件,使用Perl不必担心费用。Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移。

Perl是一种能完成任务的语言。从一开始,Perl就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。它可以很容易操作数字,文本,文件和目录,计算机和网络,特别是程序的语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西。而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理。当然,这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行。

基本语法

变量定义,以$号开头,如:$num=1;

数组定义,以@开头,如:@array=(1,2,3);

数组元素调用@array[index],其中index表示数组下标,如上例,@array[0]的值是1;

散列定义,以%开头,如:%hash=("a",1,"b",2);

散列调用%hash,其中keys表示键值,多用字符串表示,注意hash的key必须具有唯一性,但value可以不唯一,为此hash的key经常被用来做唯一化处理,如上例中的"a","b",values是keys对应的值,如1,2。%hash{"b"}的值是2。

优点 Perl追求的是简单,解决一个一般的问题用它几行代码就完成了。一个稍复杂一点的问题代码也不会超过一屏!在软件测试中,Perl通常是非常重要的角色。一般一个测试通用函数库就要分十几个文件,甚至更多,包含多达上千个定制功能。而这些函数将在主函数运行时,不定数量的被调用。几乎可以说,一切自动过程都是由Perl自己完成的,可见其功能的强大和在当今计算机技术高速发展的时期仍然发挥着重要的作用。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社区有一个笑话就是,下次股市大崩盘就很有可能是哪个家伙写的脚本里头有bug造成的。(不过,乐观点来看就是,任何还在失业的股票分析师仍然有可以利用的技巧。)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上。缺点也正是因为Perl的灵活性和“过度”的冗余语法,也因此获得了write-only的“美誉”,因为许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍。但Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。 很多时候,perl.exe进程会占用很多的内存空间,虽然只是一时,但是感觉不好。

相关文化时势造英雄为了理解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纪年表。Perl诗歌APPEAL:listen(please,please);open yourself,wide;join(you,me),connect(us,together),tell me.do something if distressed;@dawn,dance;@evening,sing;read(books,$poems,stories) until peaceful;study if able;write me if-you-please;sort your feelings,reset goals,seek(friends,family,anyone);do*not*die(like this)if sin abounds;keys (hidden),open(locks,doors),tell secrets;do not, I-beg-you, close them,yet.accept(yourself,changes),bind(grief,despair);require truth,goodness if-you-will,each moment;select(always),length(of-days).下载安装在Linux系统下、大部分类UNIX系统(包括MacOSX),perl是随系统安装的,可在命令行终端输入命令perl-v,查看版本,对于Windows有两种版本可用:StrawberryPerl与ActivePerl。 其他信息Perl语言诞生25周年 1987年12月18日,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-2008年,5.10在2007年发布,5.12在2010年发布,此后Perl开始采用每月发布一个版本,每年发布一个稳定版本的发布周期。5.14在2011年发布,5.16于2012年发布,5.18于2013年发布。(美国)施瓦茨(RandalL.Schwartz)(美国)福瓦(BrianDFoy)(美国)菲尼克斯(TomPhoenix)译者:盛春。RandalL.Schwartz、briandfoy和DTomPhoenix共同编著了数本Perl编程方面的“必读”图书,包括《EffectivePerlProgramming》(由Addison—Wesley出版)、《LearningPerl》、《ProgrammingPerl》、《IntermediatePerl》以及《MasteringPerl》(原版均由O’Reilly出版)。 常见问题Perl 就是 CGI嘘...小声。说这样的话会让懂Perl的人笑掉大牙。CGI是CommonGatewayInterface的简称。其主要的功能是在WWW环境下,藉由从客户端传递一些讯息给WWWServer,再由WWWServer去启动所指定的程序码来完成特定的工作。PHP/Python/Perl都可以撰写基于CGI的程序。另外,Perl可以做太多东西,把它的功能仅限制在网络上实在是暴胗天物。

投稿
非常不爽,删了吧! 相关词条:高级Perl编程 CPAN H2xs OrcK语言 PERL实例精解 perl map stdin 其他 Perl 拉里·沃尔 12月 Perl 正则表达式 Perl Unix Perl 拉里·沃尔 数据库 网络管理 希腊语 菲尼克斯