本书是Perl编程领域的“圣经”级著作。它提供了100多个翔实的应用案例,足以涵盖编程过程中经常遇到的方方面面,由此详细阐释出各种高效且简洁的写法。本书第1版曾畅销十年之久,而在第2版中不仅修正了前版存在的一些问题,更与时俱进地引入了许多Perl领域的新主题,使内容更加完善丰富,也更具实用性。
跨越12年来Perl的变化
增加8章内容:CPAN、数据库、软件分发、文件和文件句柄、测试、 Unicode、警告信息、Perl资源
系统更新的示例,引入当今很多新的惯用技法
推荐序
十年前,当我开始学习Perl时,我认为自己对这门语言已经了解得很多了——没错,对这门语言本身,我确实知道得很多。而我所不知道的,则是那些真正赋予Perl力量的惯用方法和其他灵活的语法结构。尽管不用它们也能写出绝大多数程序,但不掌握这些,则意味着自己的知识结构还不够完善,自己的工作效率也远远达不到理想状态。
我是幸运的,因为我得到了本书的第1版。不过,那本书从来没有机会停留在我的书架上,它一直都在我的包里,一有空我就会打开来读一段。
Joseph N. Hall的这本书内容编排简单得让人爱不释手,每一段内容虽短,但都饱含智慧,而且讲得十分明白透彻。不瞒你说,我们免费的Perl Tips电子报(http://perltraining.com.au/tips/)正是受了本书的启发才创刊的,这份电子报一直致力于探讨Perl及其社区的发展。
对于一门语言来说,十年意味着很大的变化,而社区对语言的认知则有更大的变化。因此,让我非常高兴的不仅是听到这本书的第2版即将出版的消息,更重要的是这个新版本出自Perl社区最杰出的两位成员之手。
不用说,brian对Perl的全心投入是有目共睹的。他不仅写了很多Perl语言方面的书,还负责出版一份杂志(The Perl Review),并且维护着Perl官方网站中的FAQ(常见问题解答),另外他在众多Perl及编程语言社区一直享有盛誉。
而Josh则以他运营的著名播客网站Perlcast闻名,他从2005年就开始在这个网站中以音频形式播放Perl新闻了。Josh总能找到那些著名的、有趣的人,对他们进行采访,这使他自己快速积累了大量知识,也让我对他羡慕不已。
总之,能向亲爱的读者朋友推荐本书的第2版,我感到荣幸之至。希望它能让你真正掌握这门语言的精髓,就像当年第1版对我的启蒙那样。
Paul Fenwick
Perl Training Australia总裁
再版前言
很多Perl程序员都是通过本书的第1版启蒙的。在1998年Addison-Wesley出版第1版的时候,整个世界似乎都在使用Perl。当时.com大潮正在兴起,所有懂点HTML的人都能找到程序员的工作。而这些人一旦开始编程,就需要迅速提升自己的技能。本书和其他两本“圣经级”著作Programming Perl1、Learning Perl2基本上是这些新程序员的必读书。
当时市面上还有不少其他的Perl书籍。如今的编程学习者应该很难想象当时美国书店的情况,那时候的书店中有数十米的书架摆放的都是编程书,而大多数都是关于Java和Perl的。如今的书店则只在一个小角落里摆放编程书,每种语言往往只会有几本书,而且大多数的书在上架后的半年内就会被其他书取代。
尽管如此,本书还是畅销了十年之久。这要归功于Joseph Hall对Perl编程哲学的深刻理解和他本人的过人智慧。毕竟这本书主要讨论的是Perl编程思想,他在第1版中给出的建议直到现在都还非常实用。
不过,如今Perl的世界和1998年相比已经有了很大的变化,值得提倡的理念也更多了。CPAN(Comprehensive Perl Archive Network,Perl综合典藏网)仅仅经过几年的发展,如今已经成了Perl最吸引人的特性。人们已经发现了许多更新更好的编程方式,而且这十年来业界积累了更多使用Perl的经验,也催生了很多新的最佳实践和惯用技巧。
自从本书第1版面世以来,Perl本身也有了很大的变化。第1版存在于从Perl 4到Perl 5的过渡时期,当时大家仍然在广泛使用Perl 4的一些古老特性。在这个新版本中,我们基本上消除了这些差异。现在只有一个Perl,那就是Perl 5(本书不讨论Perl 6,因为它值得另写一本书)。
现代Perl已经能够支持Unicode(而不仅仅是ASCII),因此你也应该适应这一点,我们为这个主题专门设置了一章。几年来,在Michael Schwern的推动之下,Perl已经成为被测试最多的语言,几乎每一个模块都非常稳定。Perl粉丝们怀念的“蛮荒时代”已经成为历史。今天,即使是快速原型的开发也可以同时考虑测试。如果你开发的是企业应用,那么你应该好好看一看我们针对测试给出的建议。如果你是一位正则表达式高手,那么你一定想了
解最新的Perl 正则特性,本书将介绍其中那些最常用的。
Perl 仍然在成长中,新的主题还在不断涌现。有些主题本身就值得用一本书的篇幅来介绍,比如Moose 这个“后现代”的Perl 面向对象框架,因而本书也就不勉为其难地去涵盖它们了。另一些主题,比如POE(Perl Object Environment,Perl 对象环境)、对象关系映射器,还有GUI 工具包等也都因为同样的原因而没有办法在本书中详细介绍。不过,我们已经计划再写一本More Effective Perl,到时候可能会涵盖更多的内容。
最后,Perl 的各种文档和专著较以前也丰富多了。虽然本书会尽可能多地讲到我们认为你应该知道的内容,但如果市面上已经有了详细讨论某些内容的书,我们自然也就不必置喙了,附录会推荐其他一些Perl 图书,这样做无疑也给更深入地讨论当前本书中的这些主题留出了余地。
Joseph N. Hall、Joshua A. McAdams 和brian d foy
第1 版前言
我曾经写过大量C 和C++ 代码。在专注于Perl 之前,我参与的一个重点项目是实现一门脚本语言,该语言能用来画圈、计算概率和生成FrameMaker 格式的书。这个语言用了大约5 万行与平台无关的C++ 代码,其中有不少相当有趣的特性。应该说,这个项目还是非常有意思的。
它耗费了我两年的时间。
对我来说,大多数有趣的C 或者C++ 项目都需要数月乃至数年的时间才能完成。这是因为那些有趣的功能往往比较复杂,所以需要耗费很多开发时间。不过在换为一门高级语言之后,只要3 个月的时间,我也可以把原先一大堆平淡无奇的想法变成有趣的项目。
这是我最初对Perl 感兴趣的原因之一。吸引我的是Perl 这个脚本语言中强大的字符串处理、正则表达式和流程控制能力。这正是那些C 和C++ 程序员(面对时间紧凑的项目时)最需要的特性。于是我学了Perl,而且实实在在地喜欢上了它。这要归功于一个相关项目,我在该项目中负责实现处理文本文件的功能:获取一个程序的输出,格式化之后再发给另一个程序处理。我用Perl 只花了不到一天就实现了这个功能,而如果使用其他语言,则恐怕需要几天甚至几周时间。
为何要写这本书
我一直都想成为一个作家。小时候我就迷上了科幻小说。我一直热衷于此,有时候一天能读三本,甚至还试着自己写(但写得不好)。之后的1985 年,我参加了在密歇根州东兰辛市(East Lansing)举办的Clarion 科幻小说作家培训班。随后一年左右的时间里,我偶尔会写一些短篇小说,不过从来没有发表过。后来,上课和工作占用的时间越来越多,我最终也就打消了写科幻小说的念头。不过,我还是坚持写作,只不过写的都是技术文档、教程、方案和文件。当然,我这些年来还陆续接触了好几个技术作者。
其中一个就是Randal Schwartz。我在一个工程项目中聘用他给我帮忙达一年之久(这是我第一次做技术主管,也是我第一次管理软件开发类的项目,相信大多数认识Randal 的人能猜到这点)。后来他选择离职去教Perl,过了一段时间我也去了。
在这段时间中,我对写作的兴趣更浓厚了。在C++、Perl、Internet 和World Wide Web等这些热门领域打拼了很多年,我觉得应该把其中一些有趣的东西写下来。应用和教授Perl的经验也让我的这个想法越来越强烈。我盼望着能写一本书,把自己日积月累的各种Perl技巧和反反复复遇到的陷阱汇集起来。
1996 年5 月,在圣何塞的一次开发者大会上,我和Keith Wollman 有了一次交谈。当时并没有谈到我想写书,我们只是讨论了哪些好的题材可以写成书。当谈到Perl 的时候,他问我:“你觉得一本名叫Effective Perl 的书会不会受欢迎呢?”这个书名打动了我。要知道,Scott Meyers 的Effective C++ 是我最喜欢的一本C++ 著作,而给该系列写一本Perl 的书显然是个好主意。
Keith 的话始终在我耳边回响。过了一段时间,我在Randal 的帮助下写了一个选题报告,而Addison-Wesley 公司批准了这个选题。
接下来,好戏开场了。我开始没日没夜地写作,常常在电脑跟前一坐就是12 个小时,除了用FrameMaker 写作,还在Perl 5 Porters 邮件列表中不厌其烦地问了不少的问题,查阅了几十本书和手册,编写了很多很多段Perl 代码,也喝了很多很多罐健怡可乐和百事可乐。
在查阅资料时,偶尔还会发现一些曾被自己忽略的最基础的Perl 知识。就这样过了一段时间,本书的第一稿诞生了。
这本书是我的一个尝试,希望借此与大家分享我在学习Perl 的过程中收获的经验和乐趣。最后,非常感谢你花时间阅读,希望这本书对你有价值,也能让你感到乐在其中。
Joseph N. Hall
亚利桑那州钱德勒市
第2版致谢
许多人帮我们审阅了第2版,指出了我们忽略的一些问题。对此,我们要感谢Abigail、Patrick Abi Salloum、Sean Blanton、Kent Cowgill、Bruce Files、Mike Fraggasi、Jarkko Hietaniemi、Slaven Rezic、Andrew Rodland、Michael Stemle和Sinan ünür。书中的某些地方也会直接指明他们的贡献。
另外有些人则为我们做了更多,他们几乎针对书中的每一章都提出了问题。正是因为他们的努力,书中许多错误才会在付梓前得以消灭。他们是Elliot Shank、Paul Fenwick及Jacinta Richardson。若还有错误,或许就只能归咎于我们没有管好自己的猫,这个调皮的小家伙一定是在我们不曾注意的时候到键盘上遛过弯儿。
Joseph N. Hall、Joshua A. McAdams和brian d foy
第1版致谢
这本书写来不易。我自认已经倾尽全力了,但如果不是得到了许多程序员、作者、编辑及其他专业人员的帮助肯定会更加艰难。我衷心感谢所有为本书面世而贡献了宝贵时间和精力的人。
Chip Salzenberg和Andreas “MakeMaker” K?nig帮我修正了不少程序漏洞,使得本书更加精练。对Chip的感激是无法用言语表达的。我对程序的关注实在太少了,向Chip致敬!
Perl 5 Porters邮件列表工作组也起到了很大的作用,他们为我解答了不少问题。其中尤其要感谢的是Jeffrey Friedl、Chaim Frenkel、Tom Phoenix、Jon Orwant(以The Perl Journal杂志闻名)和Charlie Stross。
Randal Schwartz是畅销书作者、教师和Just Another Perl Hacker的发起人,他也是我最主要的技术审稿人。所以如果你发现书中有任何问题,可以直接给他写邮件(开玩笑的)。非常感谢Randal,因为他在这本书上付出了许多时间和精力。
感谢Larry Wall创造了Perl,而他本人也解答了我很多的疑问,并且在一些地方提出了建议。
能和Addison-Wesley 在这个项目上合作,我觉得非常荣幸。这里遇到的每个人都善良而乐于助人,特别要感谢Kim Fryer、Ben Ryan、Carol Nelson 和Keith Wollman。
还有许多朋友在其他方面提供了帮助,Nick Orlans、Chris Ice 和Alan Piszcz 都耗费了大量时间阅读初稿。我的几位现任及前任老板Charlie Horton、Patrick Reilly 和Larry Zimmerman 则提供了许多灵感,也给了我很大鼓励。
另外,我在写作过程中尽可能坚持原创,但仍不可避免地受到Perl 在线手册和Programming Perl 等资料的影响。殊途同归,我已尽力用最有创意的方法来阐述,但很多情形下那些有关Perl 的经典诠释是难以超越的。
非常感谢Jeff Gong,他总是帮我“骚扰”电话公司,从而让我的T-1 线路保持畅通。
Jeff 总是懂得如何让客户开心。
非常感谢高尔夫这项运动,击球的简单动作能够让我保持清醒,并帮我排解压力。同样地,还要感谢《猎户座之王》和《文明II》两款游戏。
最后,我必须感谢Donna,我的未婚妻和终生伴侣,她也是专业的程序员。没有她的支持、鼓励和爱,这本书就无法写成。
Joseph N. Hall