Perl进阶(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2021-04-03 19:19:48

点击下载

作者:[美]兰德尔 L. 施瓦茨(Randal L. Schwartz)、布莱恩 d. 福瓦(brian d foy)、汤姆 菲尼克斯(Tom Phoenix)

出版社:人民邮电出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Perl进阶(第2版)

Perl进阶(第2版)试读:

前言

大约在20年前(几乎与互联网的历史一样长),Randal Schwartz编写了Learning Perl第1版。在接下来的这些年里,Perl本身基本上从一种很酷并且主要由UNIX系统管理员使用的脚本语言,成长为一门健壮的面向对象编程语言,而且能在所有人已知的操作系统上运行,甚至包括一些并不广为人知的系统。

在Learning Perl的前后6个版本中,它保持着基本一致的片幅,大概300页,而且一直包含几乎相同的一些内容,以保持结构紧凑,很适合初级程序员学习。但是,还有很多关于Perl的内容需要学习。

Randal将英文原书第一版命名为Learning Perl Object, References, and Modules,后来我们将英文原书重命名为Intermediate Perl,但是我们认为也可以叫做Learning More Perl。这是一本介绍Learning Perl中所没有涵盖的内容的书。我们将向你展示使用Perl语言编写更大型程序的方法。

在Learning Perl中,我们将每一章都设计得非常短,以至于你只需要花费大概1小时的时间来阅读。每一章都以一系列练习结束,这些练习可以帮助读者巩固所学的知识,而且这些练习的答案可以参考书末的附录。与Learning Perl一样,我们也为本书开发了很多素材,可以将这些素材用于教学环境。

除非我们特别进行了标记,否则本书介绍的全部内容能够适用于任何平台,无论是UNIX、Linux还是Windows,无论是来自ActiveState的ActivePerl,还是 Strawberry Perl,或者是Perl的其他现代实现。要想更好地使用本书,你只需要熟悉Learning Perl中的内容,而且有志于进一步地学习Perl。

在你读完本书之后,你会了解你所需的Perl语言的大多数核心概念。这个系列的下一本书是Mastering Perl,该书将专注于应用你所了解的内容,来编写更高效、更健壮的Perl应用,以及管理Perl软件开发的生命周期。

在你Perl职业生涯的任何时候,你都应当拥有Programming Perl这本书,该书是(几乎是)Perl语言最权威的“圣经”。本书结构

本书分为3个部分。第一部分介绍如何处理引用,这也是复杂数据结构以及Perl面向对象编程的关键所在;第二部分介绍对象以及Perl如何实现面向对象编程;第三部分将介绍如何处理Perl的模块结构、测试,以及用于发布代码的社区基础架构。

你最好从头开始阅读本书,适时停下完成每一章的练习。每一章都基于之前的章节,而且我们也将假定在介绍新主题时,你已经了解了本书之前章节中的内容。

第1章是关于全部内容的简单介绍。

第2章介绍如何使用Perl的核心模块和其他人编写的第三方模块。后续章节将展示如何创建我们自己的模块,但在此之前,你仍然可以使用已有的模块。

第3章选择性地介绍一些中级Perl技巧,你会在本书后续部分用到这些技巧。

第4章介绍一定程度的重定向,允许相同的代码操作不同的数据集。

第5章讲述Perl如何跟踪数据指针,并且引入匿名数据结构和自动带入。

第6章讨论创建、访问以及输出任意深度和嵌套的数据结构,包括数组的数组和散列的散列。

第7章介绍如何以动态创建并且后续执行的匿名子例程的方式捕获行为。

第8章讲述如何以标量形式存储文件句柄,可以很容易地在程序间传递或者在数据结构中存储。

第9章介绍如何编译正则表达式而不必立即使用它们,随后将它们作为构建块用于更大的模式之中。

第10章介绍关于排序的复杂操作、施瓦茨变换和处理递归定义的数据。

第11章讨论如何通过将代码分散在不同的文件和命名空间中来构建更大的程序。

第12章讲解如何创建一个Perl发行版作为你面向对象编程的第一步。

第13章介绍类、方法调用、继承和重载。

第14章讲述如何开始测试你的模块,这样就会发现你所创建的发行版中的代码问题。

第15章讨论如何为每个实例添加数据,包括构造函数、getter和setter。

第16章使用多重继承、自动方法以及文件句柄的引用。

第17章讲述use的工作方式,我们如何决定从模块中导出的内容,以及如何创建自己的导入例程。

第18章介绍如何向已销毁的对象中添加行为,包括对象持久性。

第19章介绍Moose,Moose是CPAN上的一个对象框架。

第20章介绍高级测试,测试代码以及元代码复杂的一面,诸如文档以及测试覆盖率。

第21章介绍如何通过将你的代码上传到CPAN上来与全世界分享你的代码。

附录提供所有练习的答案。本书的惯例提示 这个图标用来强调一个提示、建议或一般说明。警告 这个图标用来说明一个警告或注意事项。代码示例的使用

本书的目的是为了帮助读者完成工作。一般而言,你可以在你的程序和文档中使用本书中的代码,而且也没有必要取得我们的许可。但是,如果你要复制的是核心代码,则需要和我们取得联系。例如,你可以在无须获取我们许可的情况下,在程序中使用本书中的多个代码块。但是,销售或分发O’Reilly图书中的代码光盘则需要取得我们的许可。通过引用本书中的示例代码来回答问题时,不需要事先获得我们的许可。但是,如果你的产品文档中融合了本书中的大量示例代码,则需要取得我们的许可。

在引用本书中的代码示例时,如果能列出本书的出处信息最好不过。出处信息通常包括书名、作者、出版社和ISBN。例如:“Intermediate Perl by Randal L. Schwartz, brian d foy, and Tom Phoenix. Copyright 2012 Randal L. Schwartz, brain d foy, and Tom Phoenix, 978-1-449-39309-0.”

在使用书中的代码时,如果不确定是否属于正常使用,或是否超出了我们的许可,请通过permissions@oreilly.com与我们联系。联系方式

如果你想就本书发表评论或有任何疑问,敬请联系出版社。

美国:

O’Reilly Media Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中国:

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

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

我们还为本书建立了一个网页,其中包含了勘误表、示例和其他额外的信息。你可以通过如下地址访问该网页:

http://www.oreilly.com/catalog/9781449393090

关于本书的技术性问题或建议,请发邮件到:

bookquestions@oreilly.com

欢迎登录我们的网站(http://www.oreilly.com),查看我们的更多书籍、课程、会议和最新动态等信息。

Facebook: http://facebook.com/oreilly

Twitter: http://twitter.com/oreillymedia

YouTube: http://www.youtube.com/oreillymedia®Safari在线图书

Safari在线图书(www.safaribooksonline.com)是一个按需订阅的数字图书馆。它通过图书与视频形式分发来自技术领域和商务领域的世界级作者的专家级内容。

技术专家、软件开发人员、Web设计师以及商业和创意人士都使用Safari在线图书作为研究、解决问题、学习和认证培训的首选资源。

Safari在线图书还为组织、政府机构和个人提供了一系列产品组合和计费项目。用户可以通过完全可搜索的数据库来访问数千本图书、培训视频以及出版前的手稿,这些内容都来自诸如O’Reilly、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、Adobe Press、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett、Course Technology等出版社。致谢

来自Randal

在Learning Perl第1版的前言中,我感谢了Beaverton McMenamin[1]的Cedar Hills酒吧,在这个距离我家不远的“免费办公室隔间”里面,我在我的Powerbook 140上编写了该书的大部分初稿。就像我最喜欢的球队会在季后赛里面每天都穿上 “幸运袜”一样,我在同一个小酒馆里面编写了本书的全部内容(包括这段文字),希望第一本书的幸运之光将照耀我两次(当我在更新本书第2版的前言时,我发现我的幸运袜确实有效果)。

这家McM酒吧也有同样棒的精酿啤酒和油腻的三明治,但是没有我喜欢的披萨和面包,取而代之的是黑莓脆皮馅饼(当地一种特产)和辛辣的什锦饭(酒吧加了两个摊位,放了一些合伙经营的餐桌)。此时我没有再使用Powerbook 140,而是使用Titanium Powerbook,相对前者来说,后者有1000倍的磁盘容量、500倍的内存容量和快200倍的CPU,运行在真正基于UNIX的操作系统(OS X)上而不是限制版的MacOS上。我也通过我的144kbit/s的手机调制解调器更新了全部章节的初稿(包括这部分),然后直接发送电子邮件给审校人员,而不必等到回家用我自己的9600波特的外置调制解调器和电话线。时代真是变了啊。

然后,再次感谢McMenamin的Cedar Hills酒吧的工作人员提供的摊位和热情服务。

与Learning Perl之前的版本一样,我也感激在这里所说的一切,以及向Stonehenge咨询服务公司的同学表示感谢,当我过度使用“huh?”时,他们给我及时并且准确的反馈(通过眨眼睛和尴尬地组织问题的方式)。通过数十场演讲的反馈,我能够持续精炼和重构本书中的内容。

说到这里,本书中的内容来自于Silicon Graphics公司Margie Levine的一个为时半天的“What’s new in Perl 5?”的演讲摘要,此外,作为我经常当场讲授的一个4天的“大羊驼”课程(当时的主要目标是第4版的Perl)的补充。最终,我有一个想法就是增加这些记录,使其变为一门完整的课程,并招募Stonehenge公司的讲师Joseph Hall完成这个工作(他从绘制的示例中选择完整形式)。Joseph为Stonehenge公司开发了一个为期两天的课程,与他自己卓越的Effective Perl Programming图书(Addison-Wesley Professional)配套,我们也使用这本书作为我们的课程教材(直到今天)。

Stonehenge公司的其他讲师在过去一些年中也涉猎了“包、引用、对象和模块”的课程,包括Chip Salzenberg和Tad McClellan。但是,最近的大量修改是由我的高级讲师Tom Phoenix完成的,他经常荣获“Stonehenge公司月度最佳员工”,可能我要为此放弃我最喜欢的停车位。

在我编写本书的过程中,Tom Phoenix贡献了本书中的大部分练习和一套及时的复习笔记,包括为我提供完整的段落,以替换我已经写好的“糊涂话”。不论在课堂上,还是在编写过程中,我们合作得都非常好,因为他的这些贡献,我们都认为Tom是作为一个合著者参与的,但是,本书任何部分的错误和疏漏之处都归因于我,因为那些都不是Tom的错。

最后一点也很重要,要特别感谢brian d foy,他带领本书进入了第2版,而且编写了上一版和这一版之间大部分的修改内容。

一本书如果没有主题和发行渠道,就什么都不是,为此我必须感谢与Larry Wall和Tim O’Reilly的长期合作。谢谢你们,创造了一个行业,在近20年的时间里面,我可以用从中的收益支付我所有的生活必需品、所有想要购买的东西和梦想。

一如既往,特别感谢Lyle和Jack教会我所需的写作知识,说服我不仅要做一个程序员,还应该学习如何写作;我也是个作家。只是碰巧知道如何编程而已。谢谢!

对于你,本书的读者,为此我辛苦了无数个小时准备,啜饮着冰镇啤酒,狼吞虎咽地吃着美味的芝士蛋糕,小心翼翼地不让蛋糕碎屑掉落在笔记本电脑的键盘上:感谢你们阅读本书。衷心希望本书能够对于你精通Perl有所帮助(哪怕只是少许帮助)。如果你在街上遇见[2]我,请告诉我:Hi,我喜欢你的这本书。我很喜欢这样。非常感谢!

来自brian

首先,我必须感谢Randal,因为我从Learning Perl第1版开始学习Perl,然后通过为Stonehenge咨询服务公司讲授“美洲驼”和“羊驼”课程,学习Perl的其余部分内容。讲课通常就是最好的学习方式。

最需要感谢Perl社区,人们组织了丰富多彩和多种多样的小组,使我们引以快乐地使用这门语言来编写工具、网站和使Perl更有用的模块。很多人通过我在其他工作过程中与他们的讨论,也为本书提供了间接的贡献。有太多人了,但是如果你也曾经与我一起做过一些与Perl相关的东西,可能你也为本书做过一些贡献。

来自Tom

首先感谢O’Reilly的整个团队帮助我们完成这本书。

感谢我在Stonehenge咨询服务公司共事多年的同事和同学,以及在Usenet上帮助过我的人。你们的想法和建议极大地改进了本书中的内容。

真诚地感谢合著者Randal,给我很大的自由,让我以不同的方式开发教学素材。

感谢我的妻子Jenna Padbury,感谢你为我处理了很多善后工作。

来自我们3位作者

感谢审校人员为本书的初稿提供建议。Tom Christansen做了很多令人惊叹的工作,不但修正了他所发现的每一个技术问题,而且润色了本书的内容。本书在他的帮助之下变得更完善。David Golden,PAUSE管理团队的一位成员和CPAN工具链的黑客,在模块发布流程的部分帮助我们校正了很多细节问题。Moose的一些开发者,包括Stevan Little、Curtis“Ovid”Poe和Jesse Luehrs,也对于相关章节提供了帮助。Sawyer X, Module::Starter模块当前的维护人员,在我们编写本书的相关章节时,也极大地帮助了我们。

也感谢我们的学生,是你们多年来的反馈使我们知道哪些部分的课程内容需要改进。也正是因为你们的帮助,我们所有人才能为本书感到自豪。

感谢诸多的Perl Monger,当我们访问你们所在的城市时,让我们感到很轻松自在。希望有机会我们再次一起相聚。

最后,我们最由衷地感谢我们的朋友Larry Wall,正是因为你的智慧,向全世界分享你的这个真正酷并且强大的工具,使我们的工作变得更快、更简单而且更有趣。

[1] http://www.mcmenamins.com/.

[2] 同时可以询问一个Perl问题,我不介意。第1章简介

欢迎你进一步了解Perl。你打开这本书的原因可能是你想编写超过100行的Perl程序,或者你的老板要求你来学。

Learning Perl是一本经典著作,因为该书将介绍运用Perl编写小型和中型程序的方法(据观察,这也是Perl编程所完成的主要工作)。但是,为了避免“本书”的篇幅太长以至于吓退初学者,我们特意慎重地对知识进行梳理和选择。

后面的篇幅会以同样的风格介绍余下的故事。本书将会覆盖编写100行甚至1万行(甚至更长)的程序所需要的知识。

例如,你将会学到与多名程序员在同一项目中共同工作的方式,通过编写可复用的Perl模块,你可以将这些模块包含进发行版中由普通的Perl工具使用。这很重要,因为除非你每天工作35小时,否则你很难在没有帮助的情况下完成更庞大的任务。同样,在协作环境下,你要确保你开发的所有代码在最终的应用程序中能够很好地同他人的代码配合。

本书也展示如何处理更大和更复杂的数据结构。例如我们可能会提到的一个所谓的“散列的散列”或“数组散列的数组的数组”。只要你掌握了一些关于引用的知识,你就在通往理解任意复杂的数据结构的道路上,这将使你的工作更轻松。

其次,你还必须理解面向对象编程这一时髦概念,就是允许你的部分代码(由其他程序员编写的代码)能在同一个项目中或多或少地被重用。本书也很好地介绍该部分内容,尽管你可能从来没有面向对象的概念。

在团队中工作的一个重要的方面是:有一个发布周期以及一个进行单元测试和集成测试的流程。在本书中你会学到如何把你的代码打包成一个发行版并且对该发行版提供单元测试,在目标环境中对你的代码进行开发和验证。

另外,就像我们在已经出版的Learning Perl中所保证和传递的那样,我们将会在整个学习过程中用一些有趣的例子和双关语让你的学习过程充满乐趣。尽管我们把Fred、Barney、Betty和Wilma送回家了,但我们让一些新的明星来担当角色。1.1 背景知识

我们假定你已经读过Learning Perl,至少是读过第5版,或者至少你假装已经读过,并且已经使用Perl有一段时间,已经完全理解它的基础知识。例如,我们将不会在本书中解释访问数组元素或者从子例程返回值的方法。

确保你已经理解下面的内容,所有这些都在Learning Perl中介绍过。● 在你的系统上运行Perl脚本的方法。● Perl的3个基本变量类型:标量、数组和散列。● 控制结构,如while、if、for和foreach。● 子例程。● 基本的正则表达式。● 列表操作符,如grep、map、sort和print。● 文件操作,如open、文件读取和-x(文件测试)。

本书对于这些主题进行深入探讨,不过假定你已经掌握这些基础知识。

本书最后的部分讲述发行版和对CPAN做贡献。要做到这些,你现在需要申请一个PAUSE账户,当你读到对应部分的时候,就可以使用它。可以通过以下链接申请该账户:https://pause.perl.org/pause/authenquery?ACTION=request_id.1.2 strict和warnings

Learning Perl中介绍了strict和warnings杂项,并且希望你在所有代码中使用它们。然而对于你将在本书中见到的大多数代码,假定我们已经打开strict和warnings,因此我们不必因为重复的样本代码而分散精力,正如我们不使用shebang行和常见的文本块。当我们呈现完整的示例时,我们也将包含这些杂项。

你可能希望做我们做的事情,而不是从零开始编写程序,我们打开一个模板,里面有我们常用的代码。直到你开发出自己的模板,完成标准的文档并且用你喜欢的做事方式,你可以从一个简单的示例开始,假定周围都是如下所示的代码示例:1.3 Perl v5.14

本书使用当前最新的Perl v5.14版本,该版本于2011年发布。通常,该语言的详细信息在此版本下是稳定的。特别是自从一些双重生命的模块在CPAN上分别独立出现时,我们使用的一些模块可能已经更新。因为我们通常提出Perl的基本理念并且通常扼要概述模块,所以对于每一个模块的更新,你总是需要查看该模块的文档。注意 当我们于2012年年中完成本书的编写时,Perl v5.16版已经准备在本书递交出版商一周后发布,我们可能很巧合地在本书中会描述到它的某些特性。

一些更新的特性需要我们明确地声明,我们希望使用它们而不必影响针对之前Perl版本的程序。启用这些特性最简单的办法是告诉Perl我们需要的版本。数字5.014必须有3个数字放置于小数点后(假使有一天出现Perl 5.140):

可以加上符号v和它的多个部分:

使用两个小数点的形式,可以省略字母v:

但是,这将诱惑我们在所有情况下省略字母v。

每当我们编写一些需要Perl特定版本中特性的代码时,我们将会插入use v5.14行(或者任何合适的版本信息),使用能够使特性生效的第一个版本。如果可以,我们也会展示一些能够在Perl之前版本上工作的代码。我们考虑使用Perl v5.8版,该版本于2002年第一次发布,是任何人都能使用的最早版本,因此当没有指定一个版本时,该代码示例就假定为Perl v5.8。通常情况下,我们致力于使编写的代码能够用于尽可能多的人和尽可能多的Perl版本上,但是我们也希望你使用尽可能新的Perl版本。

要掌握关于Perl v5.14的更多基础知识,你可能需要查阅Learning Perl第6版。关于版本的一个注解

在本书中,我们通过前面的字母,以v5.M.N的形式表示Perl的版本。目前为止,我们也在版本前加一个前缀“Perl”,但是当我们谈及版本间的差异时,将会变得很沉闷。相反,我们将不再谈论Perl的这一点。当我们说“v5.14.2”时,我们就是在谈论Perl 5.14.2版。这是在我们编写本书时的维护版本,尽管v5.16版的发布指日可待。

在v5之后的数字要么是奇数要么是偶数,并且这就是实验版本和维护版本的差别。维护版本(如v5.14)用于普通用户和生产场景。实验版本(如v5.15)是用于Perl 5核心维护小组(Porter)添加新特性、重新实现或者优化代码和改变不稳定的代码的地方。当他们准备完毕时,将实验版本升级到维护版本,是通过将第二个数字加一,变为偶数来表示的。

对于第三个数字(如v5.14.2中的2)是一个修正发布。当我们说v5.14时,我们所指的是该版本下的全部修正版本。有时候,我们需要表示一个特定版本,在Learning Perl中,你可能记得在v5.10.0版和v5.10.1版之间,智能匹配修正了一个严重的设计bug,并且改变了它的行为。

本书仅限于v5,还有另外一件事,有时候叫做Perl v6,但是这与v5毫无关系。Perl v6被设计成一个全新的语言规范,并且也是由Larry wall设计的,但它不是v5的升级(即使在2000年,我们认为可能是这样)。我们知道这很让人迷惑,并且对于v6的用户而言也是一样,这就是v6规范的实现使用了不同名字的原因,如Rakudo和Niecza。1.4 关于这些脚注

类似于Learning Perl,本书加入了一些更深奥的主题,并且对于这些主题添加了脚注。第一次阅读本书的读者可以选择先不读,再到下一次阅读时再阅读该部分主题。脚注中的内容与本书后续内容关系不大。1.5 关于后续的练习

完成每一章后面的练习很重要。亲自动手训练效果会更好。提供该训练的最佳方式是在每看书半个小时至一个小时后,提供一系列练习。如果你的阅读速度很快,阅读完一章花费的时间可能小于半小时。慢一点,深呼吸,然后做练习!

每个练习有一个“完成分钟数”的评级。我们打算使该评级能够达到钟形曲线的中点,但如果你花费了更多或者更少的时间,也别灰心。有时候这仅仅取决于你在学习或工作中,面对相同编程任务的次数。这个数字只是一个参考。

附录中列出了每个练习的答案。再说一次,别偷看答案;否则你将毁掉练习的价值。1.6 获取帮助的方式

作为本书的作者,我们总是很高兴尽我们所能地帮助别人,但是我们已经被爆满的E-mail所淹没。有一些在线资源,你可以从那里获取帮助,你可以直接从我们这边获取这些资源,也可以从其他很多在Perl社区中有过贡献的人那里获得。

Stack Overflow(http://www.stackoverflow.com/)

Stack Overflow是一个对于所有类型的编程问题进行免费问答的网站,并且有很多知识丰富的Perler经常回答你的问题。你很可能在一个小时内得到免费的完美解答。你甚至可能从本书作者那里得到答案。

Perlmonks(http://www.perlmonks.org/)

Perlmonks是一个在线Perl社区,你可以在这里提问,发表你关于Perl的想法,并且和其他Perler互动。如果你有一个关于Perl的问题,人们可能愿意在Perlmonks上讨论。你可以搜索归档文件或者开创一个新话题。

learn@perl.org和http://learn.perl.org/

learn@perl.org邮件列表是一个专门为Perl新手提问题而设计的安全地方,不必担心你会打扰任何人。该列表在等待你的问题,无论你问的是多基础的问题。

module-authors@perl.org

如果你的问题是专门关于编写和发布模块的内容的,有一个特别的邮件列表:module-authors@perl.org。

comp.lang.perl.misc

如果你更多的时间在使用Usenet,你可以在comp.lang.perl.misc上提问题。一些长期的Perl用户关注这个组,并且有时候他们也很有帮助。1.7 如果是一个Perl课程讲师

如果你是一个Perl讲师,决定使用本书作为你的教材,你需要知道,对于大多学员而言,本书中的练习都足够短小,只需45分钟到一个小时就可以完成,留下的一点时间可以休息一下。一些章节的练习可能会更快一些,而另一些章节可能需要稍长的时间。这是因为一旦在方括号中写入所有的小数字,我们就发现我们不知道添加的方式。

现在,让我们翻开下一页,正式进入学习阶段。1.8 练习

在每一章结尾,我们按照如下方式列出了练习。在每个练习之前,我们加入了我们认为大多数人完成该练习所需花费的时间。如果你需要更长时间,这也没什么。

可以在附录A中找到本练习的答案。

1.[5分钟] 在http://pause.perl.org/创建一个PAUSE账号。你将在本书的最后一章用到该账号,并且我们希望你能提前创建好。

2.[5分钟] 查阅本书的网站:http://www.intermediateperl.com/。你可能对于下载的部分感兴趣,该部分有一些对于练习有用的文件。下载归档文件,即使你后续没有办法访问互联网,你也能离线使用这些文件。第2章使用模块

Perl的一个杀手级特性是Perl综合典藏网(Comprehensive Perl Archive Network),我们称其为CPAN。Perl安装时已经自带许多模块,但是CPAN拥有更多的第三方模块。如果我们需要用Perl解决某些问题,或者完成某个任务,可能在CPAN上就有现成的模块能够帮助我们完成。高效的Perl程序员是能够聪明地使用CPAN的人。Learning Perl中对CPAN有一个简单的介绍,因为它太重要了,我们将在此再次叙述。注意 我们可以浏览CPAN的主页(http://www.cpan.org/),或者它的搜索界面:CPAN Search(http://search.cpan.org/)和MetaCPAN(https://www.metacpan.org/)。

模块是用于程序的构建块,模块能够提供可复用的子例程、变量和甚至是面向对象的类。在通往构建模块的道路上,我们将展示你可能感兴趣的一些东西。我们也将介绍一些使用模块的基础知识,这些知识已经由其他人编写完成。

正如我们在Learning Perl中所注明的,我们不必理解模块的全部内容,以及当使用模块时它们内部的运作方式(学习本书后你将会有更深入的理解)。通过模块文档中的示例,我们能够做很多事情。为了启动Perl,我们将立即开始使用Perl模块,等以后再解释它们的结构和特殊语法。2.1 标准发行版

Perl已经自带很多流行的模块,在v5.14发行版中,超过66MB的内容是模块。在1996年10月,v5.3.7发行版拥有98个模块。在2012年年初,v5.14.2发行版拥有652个模块。这确实是Perl的一个优势:它已经自带了我们所需要的很多东西,让你不需要做太多额外的工作,就可以完成有用并且复杂的程序。注意 使用Module::CoreList模块查看不同Perl版本中自带模块的信息,这就是我们最终得到这些数字的方法。

贯穿本书,我们将试图确定Perl安装时自带的模块是哪些(并且通常情况下,是Perl第一次收录这些模块时的版本)。我们称它们为“核心模块”,或者将它们标注为 “标准发行版”。如果我们安装了Perl,我们将拥有这些模块。因为我们使用v5.14编写本书,当考虑Perl的核心内容是哪些时,我们将假定为Perl当前版本的模块内容。

当开发我们自己的代码时,我们可能希望考虑是否仅使用核心模块,以便我们可以确保每一个安装相同Perl版本的人,都将拥有这些模块。我们将避免在此争论,主要是因为我们太热爱CPAN了,以至于不能没有它。同时我们也将立刻展示如何确定哪个模块来自于哪个Perl版本的方法。2.2 探讨CPAN

CPAN无疑是Perl最吸引人的特性,它由一群努力工作的志愿者提供工具和服务,使人们发布高质量的软件并且评估和安装模块变得轻而易举。尽管这不是有用的CPAN工具综合列表,但是它包括我们最常使用的服务。从这个列表开始,我们也将很快地找到有用的服务。

CPAN Search(http://search.cpan.org/)

最久负盛名且最为大众所知的CPAN搜索服务是Graham Barr的CPAN搜索。我们能够浏览或者搜索模块,并且每个发行版的页面拥有关于该发行版重要事件和信息的链接,包括来源于第三方的信息,如测试结果、bug报告等。

MetaCPAN(https://www.metacpan.org/)

MetaCPAN是CPAN的下一代搜索界面。它几乎完成CPAN Search的所有事情,但是加入了一个API,因此我们能够基于他们的数据编写我们自己的应用。

CPAN Testers(http://cpantesters.org/)

由作者上传至CPAN的每一个模块都被自动测试。一大群测试人员下载当前发行版,并且在他们各自的平台上测试。他们将结果发送至CPAN Testers的中央数据库,该数据库整理所有的测试报告。作为模块的作者,我们拥有免费的测试服务。作为模块的用户,我们能够检查测试报告,判断发行版的质量或者查看它是否能够在我们的计算机配置上工作。

CPANdeps(http://deps.cpantesters.org/)

David Cantrell做了比CPAN Tester更进一步的工作:合并了测试报告中所有关于模块依赖性的信息。不是单独依赖于模块本身的测试。通过记录整个依赖性链中的测试结果,我们能够查阅安装问题的可能性。对于任何软件的安装,最让人感到失落的就是在安装过程中出现错误,但是CPANdeps能够帮助我们杜绝这类问题。作为该服务的一部分,David也在维护C5.6PAN和C5.8PAN,这些是CPAN的专业化版本,分别拥有仅能够在v5.6和v5.8这两个发行版上运行的每个模块的最终版本。

CPAN RT(http://rt.cpan.org/)[1]

RT是来源于Best Practical的问题跟踪系统,并且为CPAN的模块作者提供服务。CPAN上的每个模块在RT上自动获取问题队列,并且对于很多模块,RT是主要的问题队列。一些模块的作者可能偏好使用其他的bug跟踪系统,但使用RT可以作为良好的开端。2.3 使用模块

几乎每个Perl模块都具备文档,即使我们可能不知道所有幕后的工作方式,但如果知道接口的使用方式,我们就真的不需要担心这些事情。毕竟,这就是有接口的原因:隐藏细节。注意 我们也可以使用http://perldoc.perl.org/网站,以HTML格式或者PDF格式读取Perl一些版本的文档。[2]

在本地机器上,可以使用perldoc命令读取模块文档。输入感兴趣的模块名称,然后得到它的输出文档:

上面的文档只显示包含在文档的顶部最重要的部分(至少当我们开始时是最重要的)。模块文档通常遵循传统UNIX帮助手册的格式,以命名(NAME)部分和概要(SYNOPSIS)部分作为开始。

概要提供模块的使用示例,如果我们能够暂时抛开模块并且遵循示例中的方法,我们就能够使用该模块。这就是说,我们可能尚未熟悉一些Perl技巧和概要中的语法,但我们能够仅遵循示例中的方法进行并且完成期望的工作。

现在,因为Perl是一个过程、函数、面向对象和其他一些语言类型的混合体,Perl模块引入大量不同的接口。我们将以略微不同的方式使用这些模块,但只要我们检查文档,就不会犯错误。2.4 功能接口

要加载一个模块,可以使用Perl内置的use函数。我们不会在此深入讨论所有细节,稍后会在第11~17章展开。此时此刻,我们只是想要使用模块。我们从File::Basename模块开始,该模块来自于核心模块。将该模块加载到脚本中,可以按照如下所示方法:

当按照上面的方法编写程序时,File::Basename模块把三个子例程(fileparse、basename和dirname)引入脚本(第17章将展示使用它们的方法)。从此以后,我们能够使用这些子例程,如同已经直接在同一文件中定义了它们一样。

这些例程从一个完整的路径名中提取文件名和目录部分。例如,如果我们在Windows上运行,并且$some_full_path为D:\Projects\Island Rescue\plan7.rtf,然后$basename将得到plan7.trf,并且$dirname将得到D:\Projects\Island Rescue。如果我们运行在类UNIX系统上,并且$some_full_path为/home/Gilligan/Projects/Island Rescue/plan7.rtf,然后$basename将得到plan7.trf,并且$dirname将得到/home/Gilligan/Projects/Island Rescue。

File::Basename模块能够识别当前环境下的操作系统类型,因此它的函数能够理解对于我们可能遇到的不同种类的分隔符,正确解析字符串的方法。

然而,假如我们已经拥有一个dirname子例程。我们现在使用File::Basename模块提供的函数定义覆盖它!如果我们打开警告,就将看到一条由此产生的消息,但除此以外,Perl真的不在乎。选择需要导入的内容

很幸运,我们能够通过在模块名之后指定一个子例程列表,使use操作限定它的操作,该列表叫做导入列表:

现在,该模块仅仅提供这两个导入的子例程,并且不干涉我们自己的dirname例程。但这样输入很笨拙,所以更常见的是按照如下方式使用qw操作符编写:

即使导入列表中仅有一项,我们仍然倾向于将该项写入qw()列表,使程序一致性更好并且易于维护;通常情况下,我们将返回到要求“给我该模块的另一种编写方法”,如果使用qw()操作符编写导入列表,事情将变得很简单。

我们保护了自己拥有的dirname例程,但如果我们还是想要使用File::Basename的dirname例程提供的功能该怎么做?没问题,我们只需要把它以完整包的规范拼写出就可以使用。

use后的列表名称不会改变在模块的包中定义的子例程(在该示例中,File::Basename)。我们能够始终使用方法完整的路径名,不必考虑导入列表,如下所示:注意 在调用子例程时,我们不需要在前面添加“&”符号,这是因为编译器已经通过use语句知道子例程的名称。

举一个极端的(但极端有用)例子,我们能够将导入列表指定为一个空列表,如下所示:

空列表和没有列表的概念是不一样的。空列表的意思是说:“请不要导入任何子例程”,而没有列表的意思是说:“请导入默认的子例程”。如果模块的作者工作做得比较好,默认值可能就是我们想要的子例程。2.5 面向对象的接口

与File::Basename模块导入的子例程相比,另一个核心模块File::Spec也提供类似的功能。File::Spec模块用于支持文件规范的一般操作。(文件规范通常是文件或者路径的名称,但它可能是一个不存在的文件名称,也就是说,它不是一个真的文件名,是这样吗?)注意 如果我们想要一个函数接口,我们就可以使用File::Spec::Functions模块。

与File::Basename模块不同,File::Spec模块有一个主要面向对象的接口。与之前一样,我们使用如下use语句加载该模块:

然而,因为该模块拥有一个面向对象的接口,所以它不导入任何子例程。相反,接口告诉我们使用它的类方法访问该模块的功能。catfile方法使用合适的目录分隔符连接一个字符串列表:

以上语句调用File::Spec模块的catfile类方法,该方法为本地操作[3]系统创建一个合适的路径,并且返回单个字符串。这与File::Spec模块提供的其他大概二十多个操作在语法上都是相似的。

File::Spec模块提供一些以恰当的方式处理文件路径的其他方法。我们能够在perlport文档中获得更多关于可移植性问题的信息。2.5.1 一个更典型的面向对象模块:Math::BigInt

不要因为File::Spec模块没有创建对象,而且看上去比较像是“非面向对象”模块而感到失望。让我们查看另一个核心模块:Math::BigInt,该模块能够处理超出Perl本身范围的整数。注意 Perl被当前运行的硬件架构所限制,这是少数几个硬件限制之一。

不必像使用字面量一样使用数字,Math::BigInt模块将其变为数字:

如前所述,该模块没有任何导入内容。它的整个接口使用类方法,如new关键字,放置于类名之后用于创建实例,然后调用实例方法,如bpow方法和bstr方法,这些方法放置于实例名称后。2.5.2 更佳的模块输出

Perl的强项之一是它的报表功能。我们可能认为它仅限于文本,但是通过使用合适的模块,我们能够创建任何格式。例如,使用Spreadsheet::WriteExcel模块,当我们能够创建不仅有用而且格式漂亮的Excel文档时,我们就成为办公室的明星。

正如我们直接使用Excel应用程序所知道的,我们打开一个工作表并且在工作表中放入数据。如下所示,直接使用文档中的代码,我们很容易创建第一个工作表:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载