
本书是Perl编程领域的“圣经”级著作。它提供了100多个翔实的应用案例,足以涵盖编程过程中经常遇到的方方面面,由此详细阐释出各种高效且简洁的写法。本书第1版曾畅销十年之久,而在第2版中不仅修正了前版存在的一些问题,更与时俱进地引入了许多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
目录 推荐序 前言 致谢 关于作者 Introduction Chapter 1 The Basics of Perl Item 1. Find the documentation for Perl and its modules. Item 2. Enable new Perl features when you need them. Item 3. Enable strictures to promote better coding. Item 4. Understand what sigils are telling you. Item 5. Know your variable namespaces. Item 6. Know the difference between string and numeric comparisons. Item 7. Know which values are false and test them accordingly. Item 8. Understand conversions between strings and numbers. Item 9. Know the difference between lists and arrays. Item 10. Don’t assign undef when you want an empty array. Item 11. Avoid a slice when you want an element. Item 12. Understand context and how it affects operations. Item 13. Use arrays or hashes to group data. Item 14. Handle big numbers with bignum . Chapter 2 Idiomatic Perl Item 15. Use $_ for elegance and brevity. Item 16. Know Perl’s other default arguments. Item 17. Know common shorthand and syntax quirks. Item 18. Avoid excessive punctuation. Item 19. Format lists for easy maintenance. Item 20. Use foreach , map , and grep as appropriate. Item 21. Know the different ways to quote strings. Item 22. Learn the myriad ways of sorting. Item 23. Make work easier with smart matching. Item 24. Use given-when to make a switch statement. Item 25. Use do {} to create inline subroutines. Item 26. Use List::Util and List::MoreUtils for easy list manipulation. Item 27. Use autodie to simplify error handling. Chapter 3 Regular Expressions Item 28. Know the precedence of regular expression operators. Item 29. Use regular expression captures. Item 30. Use more precise whitespace character classes. Item 31. Use named captures to label matches. Item 32. Use noncapturing parentheses when you need only grouping. Item 33. Watch out for the match variables. Item 34. Avoid greed when parsimony is best. Item 35. Use zero-width assertions to match positions in a string. Item 36. Avoid using regular expressions for simple string operations. Item 37. Make regular expressions readable. Item 38. Avoid unnecessary backtracking. Item 39. Compile regexes only once. Item 40. Pre-compile regular expressions. Item 41. Benchmark your regular expressions. Item 42. Don’t reinvent the regex. Chapter 4 Subroutines Item 43. Understand the difference between my and local . Item 44. Avoid using @_ directly unless you have to. Item 45. Use wantarray to write subroutines returning lists. Item 46. Pass references instead of copies. Item 47. Use hashes to pass named parameters. Item 48. Use prototypes to get special argument parsing. Item 49. Create closures to lock in data. Item 50. Create new subroutines with subroutines. Chapter 5 Files and Filehandles Item 51. Don’t ignore the file test operators. Item 52. Always use the three-argument open . Item 53. Consider different ways of reading from a stream. Item 54. Open filehandles to and from strings. Item 55. Make flexible output. Item 56. Use File::Spec or Path::Class to work with paths. Item 57. Leave most of the data on disk to save memory. Chapter 6 References Item 58. Understand references and reference syntax. Item 59. Compare reference types to prototypes. Item 60. Create arrays of arrays with references. Item 61. Don’t confuse anonymous arrays with list literals. Item 62. Build C-style structs with anonymous hashes. Item 63. Be careful with circular data structures. Item 64. Use map and grep to manipulate complex data structures. Chapter 7 CPAN Item 65. Install CPAN modules without admin privileges. Item 66. Carry a CPAN with you. Item 67. Mitigate the risk of public code. Item 68. Research modules before you install them. Item 69. Ensure that Perl can find your modules. Item 70. Contribute to CPAN. Item 71. Know the commonly used modules. Chapter 8 Unicode Item 72. Use Unicode in your source code. Item 73. Tell Perl which encoding to use. Item 74. Specify Unicode characters by code point or name. Item 75. Convert octet strings to character strings. Item 76. Match Unicode characters and properties. Item 77. Work with graphemes instead of characters. Item 78. Be careful with Unicode in your databases. Chapter 9 Distributions Item 79. Use Module::Build as your distribution builder. Item 80. Don’t start distributions by hand. Item 81. Choose a good module name. Item 82. Embed your documentation with Pod. Item 83. Limit your distributions to the right platforms. Item 84. Check your Pod. Item 85. Inline code for other languages. Item 86. Use XS for low-level interfaces and speed. Chapter 10 Testing Item 87. Use prove for flexible test runs. Item 88. Run tests only when they make sense. Item 89. Use dependency injection to avoid special test logic. Item 90. Don’t require more than you need to use in your methods. Item 91. Write programs as modulinos for easy testing. Item 92. Mock objects and interfaces to focus tests. Item 93. Use SQLite to create test databases. Item 94. Use Test::Class for more structured testing. Item 95. Start testing at the beginning of your project. Item 96. Measure your test coverage. Item 97. Use CPAN Testers as your QA team. Item 98. Set up a continuous build system. Chapter 11 Warnings Item 99. Enable warnings to let Perl spot suspicious code. Item 100. Use lexical warnings to selectively turn on or off complaints. Item 101. Use die to generate exceptions. Item 102. Use Carp to get stack traces. Item 103. Handle exceptions properly. Item 104. Track dangerous data with taint checking. Item 105. Start with taint warnings for legacy code. Chapter 12 Databases Item 106. Prepare your SQL statements to reuse work and save time. Item 107. Use SQL placeholders for automatic value quoting. Item 108. Bind return columns for faster access to data. Item 109. Reuse database connections. Chapter 13 Miscellany Item 110. Compile and install your own perl s. Item 111. Use Perl::Tidy to beautify code. Item 112. Use Perl Critic. Item 113. Use Log::Log4perl to record your program’s state. Item 114. Know when arrays are modified in a loop. Item 115. Don’t use regular expressions for comma-separated values. Item 116. Use unpack to process columnar data. Item 117. Use pack and unpack for data munging. Item 118. Access the symbol table with typeglobs. Item 119. Initialize with BEGIN ; finish with END . Item 120. Use Perl one-liners to create mini programs. Appendix A Perl Resources Appendix B Map from First to Second Edition Books Websites Blogs and Podcasts Getting Help Index
Joseph N. Hall,自称“电脑神童”,一路玩着得州仪器的可编程计算器和配有 4KB 内存的 Radio Shack TRS-80 Model 1 长大。14 岁时第一次教授计算机课程。Joseph 拥有北卡罗来纳州立大学计算机科学学士学位,自 1984 年起开始以编程为生。他从 1987 年起开始使用 UNIX 和 C,自 1993 年以来一直在使用 Perl。他的兴趣涉及软件工具和编程语言、钢琴和电子琴,以及高尔夫。__eol__Joshua A. McAdams 活跃于 Perl 社区已近 5 年。他创办了Perlcast,主持过两届在芝加哥的YAPC::NA,他为 Chicago.pm 举办会议,在世界各地的 Perl 会议上做过发言,是一位 CPAN 作者。这是他的图书处女作,不过此前已为 The Perl Review 和 Perl Advent Calendar 写过文章。至于日常工作,Josh 就职于 Google,在那里他的日常开发并不一定涉及 Perl,不过只要可能他就会 使用。__eol__brian d foy 是《Perl 语言入门(第5版)》和 Intermediate Perl 的合著者,以及《精通 Perl》的作者。他发起了第一个 Perl 用户组 New York Perl Mongers,出版了 The Perl Review,维护着部分 Perl 核心文档,是一名 Perl 讲师,并常在大会上发言。__eol__