精通Perl(第2版)(通往Perl大师之路必读经典书籍,体现了一种编程思维,能够帮你解决很多实际的问题

【美】brian d foy(布瑞恩·D·福瓦)著  

王兴宇 刘宸宇 译

ISBN 978-7-121-25419-2

2015年3月出版

定价:89.00元

424

16

编辑推荐

- 探索高级的正则表达式功能

- 如何避免程序的常见安全问题

- 对 Perl 程序的性能分析和基准测试可以让你发现改进之处

- 清理 Perl 代码,使之更加直观和易读

- 了解 Perl 如何持续跟踪软件包内的变量

- 动态定义子程序

- 不必改动原有代码即可提升模块

- 使用位操作和位向量更有效地存储更大的数据

- 学习如何检测 Perl 中未报告的错误

- 深入学习日志、数据持久化和绑定变量的魔法

内容提要

《精通Perl(第2版)》作者brian d foy 用他生动的第一人称视角向各位读者介绍了精彩的Perl 高级语言知识以及丰富的实战工具与实用技巧。《精通Perl(第2版)》各章的内容相对独立,您完全可以根据自己的兴趣或需要直达你所需要的章节。

《精通Perl(第2版)》的读者主要面对具有较多经验的Perl 编程人员。阅读本书前,建议阅读本书的姊妹篇《Perl 语言入门》和《Perl 进阶》。作者在这本书里针对调试、优化、错误和日志等方面均有深入解析,也揭示了Perl 中如绑定变量、持久化存储等各种魔法般的特性和功能的实现细节和用途。书中还对如何开发、调试自己的模块,以及如何做出更适合使用的模块做了详细介绍。

总之,本书可以作为读者在向Perl 高手进阶过程中的一个助力器,希望读者能在阅读过程中深入思考,加入自己的理解,用Perl 来完成一件件神奇的事情。

目录

前言  vii

第1章  高级正则表达式  1

可读的正则表达式/x 和(?#...) 1

全局匹配3

全局匹配锚定5

递归正则表达式7

重复子模式7

前后查找19

向前查找断言(?=PATTERN) 与(?!PATTERN) 19

向后查找断言(?<!PATTERN) 与(?<=PATTERN) 23

调试正则表达式26

参数-D 26

总结31

延伸阅读31

第2章  安全编程技术 33

不良数据会毁了你的生活33

污点检测34

用警告代替致命错误36

自动污点检测模式37

mod_perl 37

污点数据37

污点检测的副作用39

清除数据污点40

IO::Handle::untaint 42

哈希表关键字42

Taint::Util 43

用污点数据选择无污点数据44

符号引用44

DBI 防御性数据库编程47

system 和exec 命令的列表形式50

三个参数的open 函数51

sysopen 51

限制特殊权限52

Safe 隔间52

Safe 模块的局限性59

娱乐一下59

总结61

延伸阅读61

第3章  Perl 调试器 63

避免浪费太多的时间63

世界上最好的调试器64

安全地修改模块65

封装子程序66

Perl 调试器69

备选调试器70

用-d 启用其他调试器70

Devel::ptkdb 70

Devel::ebug 72

Devel::hdb 73

集成开发环境调试器73

EPIC 74

Komodo 74

总结74

延伸阅读75

第4章  Perl性能分析 77

找出罪魁祸首77

通用方法81

DBI 性能分析83

其他DBI::Profile 报告87

懒惰是美德,能否简单点89

切换为数据库89

Devel::NYTProf 模块92

写一个自己的分析器92

Devel::LineCounter 模块92

性能分析测试套件93

Devel::Cover 模块94

总结96

延伸阅读96

第5章  Perl基准测试 97

基准测试理论97

测量时间98

比较代码102

不要停止思考105

隔离环境109

处理异常值112

内存使用113

perlbench 工具119

总结120

延伸阅读121

第6章  清理Perl程序123

好的风格123

perltidy 程序124

去除混淆126

对隐藏代码的解码126

用B::Deparse 对代码进行逆向解析129

Perl::Critic 模块131

创建我们自己的Perl::Critic 策略135

总结136

延伸阅读136

第7章  符号表和Typeglob 137

软件包变量和词法变量137

获取软件包变量139

符号表141

Typeglob 143

别名146

旧代码中的文件句柄参数148

给匿名子程序命名149

简单的方法151

总结152

延伸阅读152

第8章  动态子程序 153

子程序作为数据153

创建与替换命名子程序157

符号引用159

遍历子程序列表161

处理流水线163

自引用匿名子程序164

方法列表165

子程序作为参数使用165

自动加载方法170

哈希表作为对象171

自动切分172

总结173

延伸阅读173

第9章  修改和提升模块175

选择正确的解决方案175

给作者发送补丁175

本地修补177

接管一个模块177

分支177

从头开始做自己的模块178

替换模块的一部分178

派生子类181

一个ExtUtils::MakeMaker 的例子184

其他例子186

封装子程序186

总结188

延伸阅读188

第10章  配置Perl程序191

不要做的事191

将配置代码放到独立的文件中193

更好的办法194

环境变量194

特殊环境变量195

打开额外的输出195

命令行选项197

Perl 的-s 选项198

Getopt 模块199

配置文件204

ConfigReader::Simple 204

Config::IniFiles 205

Config::Scoped 206

其他配置文件206

具有不同名字的脚本207

交互和非交互程序207

Perl 的配置模块209

不同的操作系统209

总结211

延伸阅读211

第11章  检测和报告错误 213

Perl 错误处理基础213

操作系统错误214

子进程错误216

操作系统特定的错误218

报告模块错误219

分解问题220

异常222

eval 222

多层嵌套的die 223

在die 中使用引用225

用die 传递对象226

打破$@ 229

autodie 231

报告罪魁祸首233

捕获异常237

Try::Tiny 237

TryCatch 239

多态返回值240

总结241

延伸阅读241

第12章  日志 243

记录错误和其他信息243

Log4perl 244

子程序参数246

配置Log4perl 247

持久化日志配置251

日志分类251

其他的Log::Log4perl 功能254

总结255

延伸阅读255

第13章  数据持久化257

Perl 特有的格式257

打包257

定长记录259

展开二进制格式259

Data::Dumper 260

类似的模块264

Storable 模块266

冻结数据268

Storable 模块的安全问题270

Sereal 模块273

DBM 文件278

dbmopen 函数278

DBM::Deep 模块278

Perl 所不认识的格式280

JSON 格式280

YAML 格式282

MessagePack 格式285

总结286

延伸阅读286

第14章  使用Pod289

Pod 格式289

Pod 指令289

编码291

正文元素291

转换Pod 292

Pod 转换程序292

Pod::Perldoc::ToToc 模块294

Pod::Simple 模块295

从Pod::Simple 派生子类298

Web 服务器中的Pod 299

测试Pod 299

检查Pod 299

Pod 覆盖率300

隐藏和忽略函数的Pod 覆盖率检查301

总结302

延伸阅读302

第15章  位操作305

二进制数305

以二进制数方式输出306

位操作符307

一元取反操作符(~) 308

按位与操作(&) 310

按位或操作(|) 311

按位异或操作(ˆ) 312

左移位(<<)和右移位(>> )操作符314

位向量314

vec 函数316

位字符串的存储318

存储DNA 321

素数判定322

记录事情323

总结324

延伸阅读324

第16章  绑定变量的魔法 327

看起来普通的变量327

在用户层面328

帷幕之后329

标量330

Tie::Cycle 模块330

有界整数333

自毁值334

数组335

重新创建数组336

一些现实中的东西340

哈希表345

文件句柄347

总结349

延伸阅读350

第17章  模块即程序351

main 入口351

回到过去352

谁在调用352

测试程序353

模块即测试354

创建程序发布包359

给程序里加内容362

发布程序366

总结367

延伸阅读367

附录A 延伸阅读369

Perl 书籍369

非Perl 书籍371

附录B brian 的Perl 问题解决指导手册  373

解决问题的哲学373

我的方法374

那些我做过和仍在做的蠢事378

本书模块索引381

索引385

精彩节摘

译者序

——献给逝去的和新生的纪念

作为译者,总是有一些特权,比如说,可以在翻译的书前面,用铅字写一些自己想说的话。当然,作为读者,您可能不喜欢,不过,请您谅解我们激动的心情,愿意的话,您可以看看我们的吐槽。

我的父亲是一个传统的老知识分子,虽然我自己并不成器,但是他一直告诉我,要我写一些东西出来,留一些文字,因此能出版一些自己的文字一直是我心里长久的梦想。不过,我在各种方面的积淀还远远不够,所以直到现在也没有足以称道的文字可以出版。

在一个偶然的机会,我得到了付睿老师的委托,和刘宸宇一同接下了这本《精通Perl》的翻译工作。虽然翻译工作和出版自己的文字还不同,但是我想这也是我给去世的父亲的一点纪念吧。

Perl 我用了有十多年了吧,这门语言基本上算是我从事互联网行业以来第一门真正掌握和熟悉的语言了。最初是从一本薄薄的《Perl语言入门》,大约花了一周入门的。当时正值第一波的互联网热潮,工作方面使用Perl甚多,也陆续看过Perl方面的各种书籍,但是从来没有想到自己会有机会翻译一本Perl方面的书,更别说是这本经典Perl三部曲之一的《精通Perl》。

虽然现在Perl用的比较少了,但是今年Larry Wall先生来华访问时,还是专门去朝觐了一番。然后不久,就接到了付睿老师的委托,可谓有缘。

我平时的工作比较忙,而且也组织运作着一个翻译组:LCTT(Linux中国翻译组- http://lctt.github.io/),业余时间都占满了,所以当时对是否要接下翻译工作有些犹豫。我和LCTT的核心成员之一刘宸宇(tinyeyeser)商量了一番,感觉这个事情还是很有意义的,所以我们两个共同接下了对这本书的翻译工作。

王兴宇

我要把这本书献给我刚出生的小天使,翻译完交稿不到10天,她便降临到我的世界里,成为了我生活中不可缺少的一部分。

一直以来,我喜欢翻译对话、评论、调侃性质的技术博客等文章,钟情于感受那种面对面交流的感觉;而技术书籍这种相对较为正式的翻译,对于我来说,反而是件痛苦的事,哪怕只翻译半本(前言、附录及前8章)。但是当我真正深入本书,与brian d foy 正面交锋时,我发现,这不正是我所熟悉的面对面的对话吗?是的!不同于一般的技术书籍,大师的行文,几乎所有的主观句子都是以第一人称“I”开头,这就好像他坐在你面前,手把手讲授一样,生动、客观、幽默、立体!因此,我和王兴宇(wxy)在翻译的时候,把大部分“I”翻译成了“我们”,这样既忠于作者的语境,也更贴合中国课堂上老师的讲课习惯。

冯德伦的电影《太极》里有一句词:“人这一辈子,干好一件事就足够了”。我自认为不是一个有长性的人,一件事情很难坚持做到最好,总是觉得60分及格就可以了。因此,翻译过程中一度出现了厌烦情绪,但我很高兴自己成功坚持了下来。我要感谢几个月来,整个翻译过程中一直陪伴我督促我的媳妇儿,她怀着身孕,每当我消沉的时候,都会在我耳边给予

我支持和鼓励,“翻译完了吗?翻译完了吗?赶紧翻译啊!好好翻译啊!”每个成功男人的背后,都有一个伟(lao)大(dao)的女人。我爱这个唠叨的女人!

刘宸宇

Perl 作为老牌的编程语言,其成熟度和应用广泛令人称道,也是系统管理员和科研工作所必备的技能之一,因此,我们希望这本书的再版翻译,能够帮助读者进一步掌握Perl 语言的应用,也希望能够为开源社区反哺更多的智慧。

将来,如果有机会,我们也希望这本书能够以某种开源方式,分享给社区,并接受社区的不断反馈和完善,成为一本真正有生命力的书籍。

一本书的出版,其实要感谢很多人,虽然俗套,但是我们觉得依然有必要,占用一点小小的空间感谢他们:

感谢我们的家人的支持。

感谢我们的同事和领导的支持。

感谢编辑付睿老师的信任和委托。

感谢编辑李利健老师的辛勤审校。

感谢所有不知名的工作人员的辛勤工作。

王兴宇&刘宸宇

作者简介

brian d foy是一名多产的 Perl 培训讲师和作家,其出版的 The Perl Review 帮助人们通过教育、咨询、代码审查等方面来学习和使用 Perl。

前言

译者序

——献给逝去的和新生的纪念

作为译者,总是有一些特权,比如说,可以在翻译的书前面,用铅字写一些自己想说的话。当然,作为读者,您可能不喜欢,不过,请您谅解我们激动的心情,愿意的话,您可以看看我们的吐槽。

我的父亲是一个传统的老知识分子,虽然我自己并不成器,但是他一直告诉我,要我写一些东西出来,留一些文字,因此能出版一些自己的文字一直是我心里长久的梦想。不过,我在各种方面的积淀还远远不够,所以直到现在也没有足以称道的文字可以出版。

在一个偶然的机会,我得到了付睿老师的委托,和刘宸宇一同接下了这本《精通Perl》的翻译工作。虽然翻译工作和出版自己的文字还不同,但是我想这也是我给去世的父亲的一点纪念吧。

Perl 我用了有十多年了吧,这门语言基本上算是我从事互联网行业以来第一门真正掌握和熟悉的语言了。最初是从一本薄薄的《Perl语言入门》,大约花了一周入门的。当时正值第一波的互联网热潮,工作方面使用Perl甚多,也陆续看过Perl方面的各种书籍,但是从来没有想到自己会有机会翻译一本Perl方面的书,更别说是这本经典Perl三部曲之一的《精通Perl》。

虽然现在Perl用的比较少了,但是今年Larry Wall先生来华访问时,还是专门去朝觐了一番。然后不久,就接到了付睿老师的委托,可谓有缘。

我平时的工作比较忙,而且也组织运作着一个翻译组:LCTT(Linux中国翻译组- http://lctt.github.io/),业余时间都占满了,所以当时对是否要接下翻译工作有些犹豫。我和LCTT的核心成员之一刘宸宇(tinyeyeser)商量了一番,感觉这个事情还是很有意义的,所以我们两个共同接下了对这本书的翻译工作。

王兴宇

我要把这本书献给我刚出生的小天使,翻译完交稿不到10天,她便降临到我的世界里,成为了我生活中不可缺少的一部分。

一直以来,我喜欢翻译对话、评论、调侃性质的技术博客等文章,钟情于感受那种面对面交流的感觉;而技术书籍这种相对较为正式的翻译,对于我来说,反而是件痛苦的事,哪怕只翻译半本(前言、附录及前8章)。但是当我真正深入本书,与brian d foy 正面交锋时,我发现,这不正是我所熟悉的面对面的对话吗?是的!不同于一般的技术书籍,大师的行文,几乎所有的主观句子都是以第一人称“I”开头,这就好像他坐在你面前,手把手讲授一样,生动、客观、幽默、立体!因此,我和王兴宇(wxy)在翻译的时候,把大部分“I”翻译成了“我们”,这样既忠于作者的语境,也更贴合中国课堂上老师的讲课习惯。

冯德伦的电影《太极》里有一句词:“人这一辈子,干好一件事就足够了”。我自认为不是一个有长性的人,一件事情很难坚持做到最好,总是觉得60分及格就可以了。因此,翻译过程中一度出现了厌烦情绪,但我很高兴自己成功坚持了下来。我要感谢几个月来,整个翻译过程中一直陪伴我督促我的媳妇儿,她怀着身孕,每当我消沉的时候,都会在我耳边给予

我支持和鼓励,“翻译完了吗?翻译完了吗?赶紧翻译啊!好好翻译啊!”每个成功男人的背后,都有一个伟(lao)大(dao)的女人。我爱这个唠叨的女人!

刘宸宇

Perl 作为老牌的编程语言,其成熟度和应用广泛令人称道,也是系统管理员和科研工作所必备的技能之一,因此,我们希望这本书的再版翻译,能够帮助读者进一步掌握Perl 语言的应用,也希望能够为开源社区反哺更多的智慧。

将来,如果有机会,我们也希望这本书能够以某种开源方式,分享给社区,并接受社区的不断反馈和完善,成为一本真正有生命力的书籍。

一本书的出版,其实要感谢很多人,虽然俗套,但是我们觉得依然有必要,占用一点小小的空间感谢他们:

感谢我们的家人的支持。

感谢我们的同事和领导的支持。

感谢编辑付睿老师的信任和委托。

感谢编辑李利健老师的辛勤审校。

感谢所有不知名的工作人员的辛勤工作。

王兴宇&刘宸宇

前言

Mastering Perl(《精通Perl》)是本系列的第三本书。第一本书《Perl 语言入门》向读者介绍了Perl 语法的基础部分;第二本书《Perl 进阶》介绍了如何创建可重用的Perl 软件;本系列的第三本书,也就是本书,将所有的相关知识进行整合,为读者展示如何更加自如地运用Perl。

本书并非所谓的小窍门合集,它体现的是关于Perl 语言编程的一种思考方式,也体现在你可能会遇到的包括调试、维护、配置等实际问题中,还体现在你作为一名职业程序员的现实生活中。本书要带给你的不仅仅是发现问题之术,而是为你开启属于你的掌控答案之道。

成为一名大师

仅有本书并不能使你成为一名Perl 大师,要想成为大师,你需要依靠自己,经过大量的Perl编程实践,尝试大量的新鲜事物,同时犯下大量的错误。我将帮助你的是带你走上正确的道路,但是,成就大师之路注定是一条独立的自主之路。作为一名Perl 大师,除了能回答他人的问题,还要能够找到自己问题的解答。

在同业公会的黄金年代,工匠们在掌握一门手艺成为大师的过程中,实际上都遵循着一条特定的道路。他们从学徒工开始做起,不断重复枯燥的低微工作,直到他们掌握足够的技巧,成为更加值得信任的熟练工(journeymen)。熟练工肩负更多的责任,但仍需在公认的大师级工匠手下工作。当学到足够的手艺后,熟练工必须生产一件“大师级作品”来证明他的技巧。如果其他大师承认了这件作品具有大师级水准,这名熟练工才能成为一名公认的工匠大师。

熟练工和工匠大师们也会四处游历,向其他大师学习新的技术和技巧(尽管有争议,但这可能是熟练工的单词中一部分是“journey——旅行”的由来)。也许是对秘密技艺或不同的方法故意有所保留,每一位工匠大师都掌握着一些其他人所没有掌握的东西。熟练工的部分训练内容就是向不同的大师学习。

与其他工匠大师和熟练工的交流不断延续着工匠大师们的学习过程。工匠大师们将从其他大师那里学来的经验传授给熟练工,在这个过程中,熟练工也会把自己从另一些工匠大师那里学来的技巧带回给这名大师。真正的大师从不停止学习。

学徒工遵循的道路影响着他所学习的内容。一个师从多位大师的学徒工可以接触更多的授业途径以及视角,所有这些他都可以融合成为自己的技艺方法。某一位大师身上看似古怪的东西,通过另一位大师的不同视角更新或重新定义,也许会给这名学徒工带来另一种平衡的观点。另外,如果这名学徒工想要学习成为一名木匠或者泥瓦匠,不同的师父会根据不同的目标来传授技艺,这就给了这名学徒工一个机会来学习不同的程序和方法。

不幸的是,程序员并不处在这样的公会系统中。大部分Perl 程序员都是自学Perl (作为一名Perl 讲师,我对此很郁闷),自己编程,从来未曾得到过良师益友的帮助。我也是这么过来的。我买来第1 版的《Perl 语言入门》自学完以后,尽管当时Perl 已经比较常见,但我仍然是周围人中唯一听说过Perl 的人。之后不久,我发现了comp.lang.perl.misc,并且开始在上面回答一些我力所能及的问题。这就像是我给自己留的家庭作业。我的技术不断进步,社区的反馈尽管有好有坏,但都非常及时迅速,我学到了更多Perl 以外的东西。最后,我找到了一个可以整日用Perl 编程的工作,但我仍然是公司里唯一使用Perl 的人。这期间,我一直在comp.lang.perl.misc 上做着我的家庭作业。

偶然间,我得到了Randal Schwartz 的注意,他将我招至麾下,开启了我的Perl 学徒之路。他邀请我参与Stonehenge Consulting Services 项目,我成为了一名Perl 讲师,于是,我真正的Perl 讲授工作开始了。讲授意味着把自己掌握的东西解释给别人,对于讲的人来说,这是学习一门课程的最好方法。一段时间之后,我开始了关于Perl 的写作,这与讲课是类似的,不同的是,写作需要规范的语法(大部分时候如此)和一个用于纠错的编辑器。

于是,我所写的这本《精通Perl》作为系列书籍的第三本,第一个问题出现了,前两本《Perl语言入门》和《Perl 进阶》我手头都有,这两本大概都有300 页左右,如果需要限制在同样的页数,我如何将我多年的经验全部塞进这薄薄的一本书里呢?

一句话,我做不到。因此,我会把我认为你应该知道的都教给你,但是你仍需要学习其他的资源。正如工匠前辈们一样,你不能只片面听一个人的,还需要寻找其他的工匠大师,而这正是Perl 最棒的地方:每个问题都有许多不同的解决方式。其中一些大师写就了非常棒的Perl 书籍,有和本书同一个出版社的,也有其他出版社的。因此,有些主题本书将不再重复,下面我会再谈到这个问题。

成为大师意味着什么

本书与《Perl 语言入门》和《Perl 进阶》的侧重点稍有不同,前两本书更偏重于教程类,内容涵盖Perl 语言的大部分细节,但是涉及编程的实践内容只有很少一点。因此,本书有责任在这方面给予读者更多。

相信购买本书的各位读者都已经基本掌握了Perl ,那么,阅读本书将会锻炼你回答自我、发掘自我的能力,虽然这个过程比简单地请教他人需要付出更多的努力,但真正的事实是,这样在建立自身经验的同时,避免了因为打扰别人耗费更多的精力。

虽然我没有像Advanced Perl Programming, First Edition(《高级Perl 编程》,第1 版)和MasteringRegular Expressions(《精通正则表达式》)(http://shop.oreilly.com/product/9780596528126.do)这两本书那样,在书中涵盖其他的语言,但是你自己应该学一些其他语言。这会激发你已有的Perl 知识,带给你新的观点,这些新观点中一些会使你更加欣赏Perl ,而另外一些则会使你了解到Perl 的缺陷。

作为一名大师,你总有一天会遇到Perl 的某些缺陷。如果你没有这样一张列表,上面列举着你最痛恨的关于Perl 的五件事,以及用于支持这五件事的事实,我敢说,学习Perl ,你可能做得还远远不够;关于这一点,具体可以参见我的主题演讲视频“My Frozen Perl 2011Keynote”(http://bit.ly/JDI5LC)。这并不是Perl 本身的错。所有的语言都是如此。对Perl 的精通过程就包含了对这些东西的了解,以及了解之后对Perl 的坚持,因为对于你的程序来说,Perl 的强大要远远比那些缺点有价值得多。正因为你能够辩证地认知问题的两个方面,做出明智的选择,进而才能指导他人,而这样的人便称之为大师。

以上所有这些都在讲如何成就大师之路,涉及工作、阅读,以及和他人的交流。你做得越多,学得就越多。大师之路没有捷径。也许如你学习其他语言一样,学Perl 时,语法学得很快,但这只是整段经历中最小的一部分。即使你掌握了Perl 的大部分知识,你可能仍然需要花时间阅读一些“元”编程书籍,这些书讨论的是编程实践,而不只是摆弄语法。这些书使用的也许不是Perl 语言,但为了读懂它们,如我之前所说,你需要学习一些其他语言。作为大师,时刻保持学习。

成就大师之路需要你比学习计划掌握得更多,比昨天的自己努力得更多,还要竭尽所能从其他人的经验中汲取得更多。这不仅仅与你自己写的代码有关,因为你还需要与许多其他作者的代码打交道。

这听起来很难,但这就是成就大师之路。它值得你为之奋斗!别放弃!祝你好运!

本书适用于哪些人

本书是《Perl 进阶》的后续书籍,因此我假设你已经了解并适应了上一本书中的引用、对象和模块等概念。本书中有的地方我也会引用《Perl 进阶》中的内容,届时需要你刷新一下相应的技能。

如果是直接从其他语言转过来的,并且之前从未使用过Perl ,或者仅仅是简单接触过Perl,我建议你浏览一下《Perl 语言入门》和《Perl 进阶》,以便掌握语言的基础内容。但这样,你可能有时会不认识来源于实践和经验的惯用词汇。总之,我并不想告诉你别买这本书(嘿,我还得付房贷呢!),但这本书对你的作用可能并不如我计划的那么好,至少现在如此。

如何阅读本书

我并不想编写所谓的“保留曲目:更多Perl 功能”第三卷。我想教授给读者属于自己的Perl学习方法。我将带你走上属于你自己的成就大师之路,作为学徒,你需要依靠自己完成一些工作。有时这代表我会告诉你在Perl 文档中到哪里去寻找答案(同时这也意味着我可以腾出地方谈论一些其他话题)。

你不需要依照任何顺序阅读各章节,各章节内容并不是循序渐进的。如果某些内容你不感兴趣,大可放心地直接跳过。

关于某个主题,如果你想了解更多,可以参见我在每一章末尾附上的参考引用。

你需要掌握哪些已有知识假设你已经了解我们所编写的《Perl 语言入门》和《Perl 进阶》中的所有内容。这里的“我们”,指共同作者Randal Schwartz、Tom Phoenix 和我。

最重要的是,你应该了解以下主题,其中每一条都隐含了其他主题的相关知识:

使用Perl 模块

书写Perl 模块

参数引用、子程序以及文件句柄

基本的正则表达式语法及其工作原理

面向对象Perl

如果要讨论前面书中没有的一些内容,我会适当解释得深一些。如果涉及前面书里已经讲过的内容,我可能会再次强调,因为它们确实很重要。

本书包括在《Perl 语言入门》中学习了Perl 的基本语法,以及在《Perl 进阶》中学习了模块和团队开发的基础知识之后,接下来你需要学习一些Perl 术语,以及如何为用户编写无须帮助就能自主使用的可扩展应用程序。

本书会包括一些你在前两本书中已经见过的内容,但是深度更深。正如我们在《Perl 语言入门》中说过的,有时我们会用善意的谎言来简化细节,从而使你尽快进步,避免陷入困境。现在,是时候在困境中稍微折腾一下了。

但是,不要把我所有的话当成绝对的真理。世界上有几百万名Perl 程序员,他们都有自己的做事方法。Perl 的成就大师之路有时需要你阅读相当数量的Perl 代码,即使有些你永远也用不到。我会尽力说服你不要去干那些我认为的傻事,但那只是我的个人观点。因为你努力想要成为一名优秀的程序员,你的知识储备永远需要比实践中用到的更充裕。有时我会展示一些不建议你使用的东西,但我知道,很可能你又会在其他人的代码里看到它们。唉,这个世界并不完美。

编程并不全都是往代码里添加或修改新功能。有时要抽出部分代码,检测、观察它神奇的运行过程。有时则需要你剔除不必要的代码。编程实践并不仅仅是创建应用程序。它还涉及对代码的管理和争论。我还会展示一些技术,并非用于我们的开发工作,而是用于分析。

本书不包括

经过和编辑们的讨论,我们决定不再重复那些其他书本已经充分介绍过的主题。你也需要从其他大师那里学习,我真的不想让本书占用你书架上不必要的空间。忽略这些主题不但让我省了不少事,节省下来的空间还能用于其他更多的东西,一箭双雕。无论如何,你应该已经读过那些书了。

本书忽略这些主题并不是说你也可以忽略学习它们,在合适的地方,我会指给你相应该看的书。我在附录A中列出了一些书,我认为你应该在精通Perl 的路上把这些书收入你的书库。它们都是由其他Perl 大师写就的,每一本都有你值得学习的东西。在大多数章节最后,我还为你列出了其他一些资源。真正的大师从不停止学习。

不过,既然你已经读到这里了,那么无论出于何种原因,我就简单列出我将明确忽略的主题:Perl 的内部机制、Perl 嵌入、线程、最佳范例、面向对象编程、源码过滤器和海豚(这是一本关于“海豚安全(dolphin-safe)译注1”的书)。

本书结构

对本书内容范围以及写作目的的介绍。

第1章,高级正则表达式

进一步介绍正则表达式的特性,包括全局匹配、环视结构(lookarounds)、可读正则表达式,以及正则表达式调试。

第2章,安全编程技术

本章介绍一些如何避免编程问题的常用技术,包括污点检测(taint checking)和一些常见陷阱(gotchas)。

第3章,Perl 调试器

简单介绍Perl 调试器,如何写出你自己的调试器,以及如何使用第三方调试器。

第4章,Perl 性能分析

在你付诸行动改进Perl 程序之前,首先找出改哪里,改什么。

第5章,Perl 基准测试

指出哪种实现方法在时间、空间以及其他指标下的表现更好,还有发现这些数值真正意义的一些注意事项。

第6章,清理Perl 程序

使用Perl::Tidy 模块或Perl::Critic 模块排布别人的代码(或者甚至是你自己写的代码),使其更具美观性和可读性。

第7章,符号表和Typeglob

学习如何使用Perl 追踪包变量,如何将这一机制运用于某些强大的Perl 魔法。

第8章,动态子程序

实时定义子程序,帮助过程式编程设计转败为胜。摒弃迭代数据,转而遍历子程序列表,使你的程序更高效,更易于维护。

第9章,修改和提升模块

免于编辑原来的代码就能修复代码,这样你就能轻松回到原来的代码。

第10章,配置Perl 程序

让你的用户不用接触代码就可以配置程序。

第11章,检测和报告错误

学习如何让Perl 报告错误,如何检测Perl 无法报告的错误,以及如何将这些消息通知给用户。

第12章,日志

通过使用一个极其灵活而又强大的日志工具包Log4Perl ,让你的Perl 程序随时向你汇报情况。

第13章,数据持久化

存储数据以备稍后其他程序使用,或供同一程序的下次运行时使用,又或者以文本方式通过网络进行传输。

第14章,使用Pod

将Perl 特有的POD 文档翻译成其他任何你喜欢的格式,并进行测试。

第15章,位操作

使用位操作符和位向量高效存储大量数据。

第16章,绑定变量的魔法

不只是使用,而是创造你自己独有的Perl 基本数据类型,完成任何你想要的操作。

第17章,模块即程序

以模块的方式编写程序,充分利用Perl 模块的发行、安装和测试工具的所有优点。

附录A,延伸阅读

探索这些资源,继续你的Perl 学习。

附录B,brian 的Perl 问题解决指导手册

我最流行的手把手教程可以帮你解决任何Perl 问题。跟随教程,提高你解决问题的技巧。

本书所使用的约定

以下是本书所使用的排版约定:

斜体(Italic)

表示新的术语、网址(URL)、电子邮件地址、文件名和文件扩展名。

等宽字体(Constant width)

用于程序清单及段落中引用的程序元素,如变量名和函数名、数据库、数据类型、环境变量、声明和关键字。

等宽粗字体(Constant width bold)

表示命令或由用户输入的文本。

示例代码的使用

补充材料(示例代码、练习等)可在http://www.masteringperl.org/下载。

本书的目的是帮助你完成工作。一般来说,如果示例代码是随本书提供的,那么你可以在你的程序和文档中使用它。你不需要与我们联系来获得许可,除非你直接复制大部分的代码。例如,编写程序时使用了本书中的几段程序代码不需要许可。销售或分发O’Reilly 书籍中例子的CD-ROM 是必须经过许可的。引用本书及本书中的示例代码来回答问题不需要许可。将本书中大量的示例代码整合到你的产品文档中则需要获得许可。我们很感谢你在引用的时候保留出处信息,但是不强制。出处信息通常包括书名、作者、出版社以及国际标准图书编号(ISBN)。例如:“《精通Perl,第2 版》,作者brian d foy (O’Reilly)。

Copyright 2014 brian d foy,978-1-449-39311-3。”

如果你在使用示例代码时感到超出了合理的使用范围,或是属于以上某种需要授权的情况,请随时联系我们[email protected]

Safari® Books OnlineSafari Books Online(www.safaribooksonline.com)是一个发布来自全球技术和商业领域的顶尖作者写的书和视频等优质内容的按需数字化图书馆。

技术专业人士、软件开发者、网站设计师及商业和创意专业都用Safari Books Online 作为他们的主要研究、解决问题、学习和认证培训资源。

Safari Books Online 提供了一系列产品及针对组织、政府和个人不同的定价方案,订阅者可以访问到成千上万的图书、培训视频及出版前的手稿,这些内容都可以从出版社,如O’ReillyMedia、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBMRedbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones& Bartlett、Course Technology 等数据库中搜索而得到,想了解更多关于Safari Books Online的信息,请在线访问我们。

联系我们

对于本书的评论或问题,请联系出版商。

美国:

O’Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中国:

北京市西城区西直门南大街2 号成铭大厦C 座807 室(100035)

奥莱利技术咨询(北京)有限公司

我们为本书设置了一个网页,在该网页中列出了勘误表、示例和所有附加的信息,你可以从以下网址访问该页面:http://oreil.ly/mastering-perl-2e。

评论或询问与本书相关的技术问题也可以发送邮件到[email protected]

了解更多关于本书、课程、会议和新闻的信息,请访问我们的网站:http://www.oreilly.com。

我们的Facebook:http://facebook.com/oreilly

我们的Twitter:http://twitter.com/oreillymedia

我们的YouTube 视频:http://www.youtube.com/oreillymedia

致谢

在写本书第1 版的那一年,很多人给了我帮助。Mastering Perl 邮件列表的读者在我初稿期间给了我持续不断的反馈,其中发来的大部分建议我都采纳了,这些建议来自Andy Armstrong、David H. Adler、Renée Bäcker、Anthony R. J. Ball、Daniel Bosold、Alessio Bragadini、PhilippeBruhat、Katharine Farah、Shlomi Fish、Deyan Ginev、David Golden、Bob Goolsby、Ask BjørnHansen、Jarkko Hietaniemi、Joseph Hourcle、Adrian Howard、Offer Kaye、Stefan Lidman、EricMaki、Joshua McAdams、Florian Merges、Jason Messmer、Thomas Nagel、Xavier Noria、ManuelPégourié-Gonnard、Les Peters、Bill Riker、Yitzchak Scott-Thoennes、Ian Sealy、Sagar R. Shah、Alberto Simões、Derek B. Smith、Kurt Starsinic、Adam Turoff、David Westbrook 和Evan Zacks。

还有更多的人为第1 版提交了勘误表。我十分确信,正是他们的详细审查始终让我保持在正确的道路上。

Tim Bunce 在性能分析章节给了我非常友善的建议,包括DBI::Profile 模块等内容,而Jeffrey Thalhammer 则用他的Perl::Critic 模块大大地帮助了我目前的开发工作。Perrin Harkins、Rob Kinyon 和Randal Schwartz 自始至终都在帮我录入第1 版的手稿,我很高兴选择他们作为我的技术评审,他们的意见总是十分准确和恰当的。第2 版时,MatthewHorsfall 和André Philipp 的录入工作则对我意义重大。

尽管可能会害怕我没完没了的滋扰,但Allison Randal 仍然为本项目提供了非凡的Perl 建议与编辑指导。还有一些来自O’Reilly 其他好友的帮助,他们的付出远比一位作者创作一本书要多得多。因此,下次你碰见某一位O’Reilly 雇员的时候,一定要替我感谢他(她)。最后,我要感谢Perl 社区,多年来,从我成为其中一员时起,社区一直对我无比的友善、支持。有如此多伟大的程序员和管理员帮助我不断成为更加优秀的程序员,而我希望谨以此书,同样能够帮助那些刚刚加入Perl 的人们。

05-06 02:30