perl教程014

perl教程014 - 下载...

Info iconThis preview shows page 1. Sign up to view the full content.

View Full Document Right Arrow Icon
This is the end of the preview. Sign up to access the rest of the document.

Unformatted text preview: 下载 第 14 学时 使 用 模 块 你可能已经发现, P e r l是一种非常灵活的编程语言。它能够处理文件、文本、数学运算、 算法和任何计算机语言中通常遇到的其他问题。该编程语言的很大一部分是专门用于编写特 定目的的函数的。正则表达式是该语言的核心部分,对于 Perl的使用方法来说,它们非常重要, 不过许多编程语言没有正则表达式照样能够很好运行。 P e r l 对外部程序(反引号、管道和 system函数)的使用是非常广泛的,不过许多语言根本不使用它们。 编程员都希望尽可能将任何有用的特性纳入该语言的核心中。具有这样的包容性,就会 形成一种规模很大并且难以使用的语言。例如,有些语言的设计者认为,支持对 world wide web访问的特性应该纳入该语言的核心中。这是个非常好的思路,但是并不是每个人都需要这 个特性。如果 10 年后 web不再像现在这样重要,那么就必须下决心去掉这个特性,许多已经编 好的软件就会变得支离破碎。 P e r l采取了一种不同的路子。从 Perl 5 开始,可以使用“模块”对语言进行扩展。模块是 Perl例程的集合,它使你能扩展 Perl的功能范围。你会发现这些模块能将 web浏览、图形处理、 Windows OLE 、数据库和几乎任何想像到的特性添加给 Perl。不过请记住, Perl 的运行并不一 定需要这些模块,没有这些模块它照样能够很好地发挥作用。 使用模块,你就能够访问一个很大的工作代码库,以帮助你编写程序。本书的第三部分 将专门介绍如何使用 Perl 模块来编写 CGI程序。 在撰写本书时, Perl已经包含 3500 个以上的模块,有 20多个模块已经可以销售给用户。这 些模块大多数可以免费转用。可以将这些模块用在你自己的程序中,以实现你想要得到的任 何功能。你想解决的许多难题都可以为你解决,你只需安装正确的模块,并且正确地使用这 些模块。 在本学时中,你将要学习下面的内容: • 学习如何在你的 Perl程序中使用模块。 • 简单地了解某些内置模块的情况。 • 了解 Perl提供的核心模块的列表。 14.1 模块的概述 若要在你的 Perl程序中使用模块,可以使用 Perl的use命令。例如,若要将 Cwd模块纳入你 的程序,只需将类似下面的命令插入你的代码: use Cwd; 将use Cwd 放在代码中的什么位置,这并不重要,不过为了清楚起见和便于维护,它应该 放在靠近程序顶部的位置。 这个特定模块曾经用在第 1 0学时中。不过在第 1 0学时中,你不知道它是如何工作的。当 160 使用第二部分 高 级 特 性 下载 你运行带有 use Cwd 的程序时,就会出现下列情况: 1) Perl 解释程序打开你的程序并读入所有代码,直到 use Cwd 语句被找到。 2) 当你的 Perl 解释程序安装时,它将得到关于它的安装目录的通知。该目录被搜索,以便 找出称为 Cwd的模块,该模块是包含 Perl代码的一个文件。 3) Perl 读取该模块,该模块运行时需要的所有函数和变量均被初始化。 4) Perl 解释程序从上次终止的位置开始,继续读取和编译你的程序。 这就是该程序运行的情况。当 Perl读取整个程序后,并且在它准备运行时,该模块具备的 所有功能就可以供你使用。 你可能注意到 use strict 与use Cwd 很相似。为了避免概念的混乱, u s e 语 句是个通用指令,它可以使 P e r l 解释程序执行某项操作。如果使用 use s t r i c t ,它会改变解释程序的运行特性,使之对引用和裸单词变得比较严谨, 不过并不存在称为 s t r i c t 的模块。如果使用 use Cwd ,它将一个模块纳入你 的程序。你不必过分担心它们之间的差别,差别很小,不会对你产生很大 的影响。 当你将 use Cwd 插入你的程序中时,一个新函数就可以供你使用,这就是函数 c w d。c w d 函数能够返回你的当前工作目录的名字。 14.1.1 读取关于模块的文档 所有 Perl模块都配有它们自己的文档资料。事实上,如果你能够使用某个模块,那么就可 以访问它的文档,因为文档往往嵌入模块之中。 若要查看模块的文档,请使用带有模块名的 p e r l d o c 程序。例如,若要查看 C w d 的文档, 只需在操作系统的命令提示符处键入下面的命令: 然后就可以每次显示 1页文档。下面是一页示例文档,它作了一定的压缩: 161 第14学时 使 用 模 块使用 下载 在这个例子中, C w d模块实际上允许你使用 3个新函数,即 c w d、 g e t c w d和 f a s t g e t c w d。如 果你想使用这些函数,请阅读关于 Cwd 模块的文档。 如果你很想知道模块是如何工作的,就应该去了解它。模块主要是用 P e r l编写的,存放在系统的文件树中。 C w d 模块存放在 C w d . p m 文件中。该文 件的位置可以是不一样的,不过它通常存放在 P e r l 的安装目录下的某个位置 中。变量 @ I N C包含 C w d . p m 的可能存放位置的名字,若要输出该变量,请在 命令提示符处键入 perl -v 。 由于许多模块是其他 Perl程序员免费提供的,所以模块文档的质量差异很大。比较主流的 模块,即销售的标准模块,本书中提到的模块,以及流行的模块,如 T K 和L M P 等,都配有很 好的文档。如果你不知道模块是如何工作的,请查阅第 1 6 学时的内容,以了解有关的资料, 或者干脆询问模块的作者。 14.1.2 什么地方可能出错 如果你的 Perl安装正确,并且根本没有受到破坏,那么不应该出现任何错误。但是,世界 并不是完美无缺的,有时某些地方仍会出错。 如果你看到下面这个出错消息: 那么你应该检查安装的 Perl的版本。请在系统的命令行提示符处键入下面的命令: perl -v 如果 P e r l 报告的版本号小于 5 ,比如 4 . 0 3 6,那么你拥有的 P e r l 版本就太旧了,必须对它进 行升级。 Perl 5 的许多特性它都没有,而且所有老的软件中都存在着安全隐患。实际上第 13学 时中的代码举例都无法在 Perl 4 中运行,现在你应该注意到这个问题了,请立即进行版本的升 级。 另一个潜在的错误消息如下所示: 这种错误通常意味着存在下列 3个问题中的一个: • 模块的名字拼写有误。 模块的名字是区分大小写字母的。 Use Cwd 不同于 use cwd 。有些模块名包含冒号(: ) :, 比如 File: Find ,你必须正确键入冒号。 : • 要使用的模块不是标准产品的组成部分,它没有安装在系统的正确位置上。 安装的每个 Perl均配有大约 150个模块,这属于“标准产品” 。本学时的后面部分内容中列 出了其中的一些模块。所有这些模块都应该能够正确运行。你或你的系统管理员必须另外安 装不是“标准产品”中的模块。 本书的附录包含如何安装这些额外模块的说明。 • 安装的 Perl不完整,或者受到了破坏,也可能安装不正确。这种情况是经常发生的。 162 使用第二部分 高 级 特 性 下载 P e r l 解释程序会按照出错消息输出的 @ I N C中的路径查看已安装的模块。如果这些模块移 动了位置,被删除,或者无法使用,最简单的解决办法是重新安装 Perl。在处理这个问题之前, 首先要搞清出错的模块是否属于标准模块。已经安装的任何附加模块都可能放到其他位置中, 这是正常的。关于如何在非标准位置上安装和使用模块的详细说明,请参见本书的附录。 14.2 已安装模块简介 下面我们要简单介绍一下作为Perl核心产品的组成部分且已经安装在你的系统上的一些模块。 14.2.1 文件和目录简介 在第 1 0 学中,我们介绍了如何打开目录并且读取这些目录中包含的文件名列表。接着, 提出了如何读取子目录的问题,但是当时我们没有讲述这个问题。现在,我们就要说明如何 遍历目录和子目录的方法。 你可以编写一个常用程序,以便在不知道文件所在的确切目录的情况下查找这个特定的文 件。例如,你可能想在目录文档下的某个位置上查找名字为 important.doc的文件,如下所示: 这个插图显示了一个目录结构,它位于名字为 d o c u m e n t s 的父目录下。如果使用 o p e n d i r / r e a d d i r / c l o s e d i r来查找 d o c u m e n t s 下的某个位置上的一个文件,那是非常不容易的。首先,必 须搜索 d o c u m e n t s来查找该文件。然后必须搜索 d o c u m e n t s 下的每个目录,即 a c c o u n t i n g、 m i s c 和personal ,接着再搜索这些目录下的每个目录,如此等等。 这是过去 3 0 年来程序员一次又一次解决的一个老问题。如果你自己编写一个程序来解决 这个问题,纯粹是浪费时间。为此,Perl的设计人员采取了一个简单的解决方案,加上了 File : : F i n d 模块。若要在你的程序中使用 F i l e: F i n d模块,只需将下面这个命令输入到你的程序中 : 的某个位置,最好是靠近程序的顶部: 这时一个称为 find的新函数就可以供你使用了。 find 函数的句法如下所示: find函数的第二个参数是要搜索的一个目录列表。第一个参数对你来说是新的,它是个子 例程引用。你创建的子例程引用很像是标量或数组的引用,它只不过是前面加上一个反斜杠 的子例程名。必须使用子例程名前面的 &,才能取得子例程的引用。然后为 d i r l i s t 中找到的每 个文件和目录调用指明的子例程。 程序清单 14-1显示了为查找丢失的 important.doc而使用的程序。 程序清单 14-1 查找一个文件时所用的程序 163 第14学时 使 用 模 块使用 下载 第1 ~2 行:这两行代码是 P e r l 程序通常开始运行时的代码。 - w使警告特性激活, use strict 用于捕获错误。 第3行: File:Find模块被插入你的程序。它使你可以运用 find函数。 第5行:为‘ /documents’下的每个文件和目录调用该函数。如果你有 100个文件和 12个目 录,该例程将被调用 112次。 第6行:当 w a n t e d ( )函数被调用时, $ F i l e : F i n d : n a m e将包含到达被查看的当前文件的 : : 路径, $ _只包含文件名。这行代码用于确定文件名是 i m p o r t a m t . d o c 。如果是,则输出全路径 名。 第1 0行:用子例程引用 \ & w a n t e d和一个目录调用 f i n d函数。并为‘ / d o c u m e n t s’下的每个 文件和目录调用 wanted()函数。 由find调用的函数将可以使用下列变量: • $File: Find: name 当前路径名,目录和文件名。 : : • $File: Find: dir 当前目录名。 : : • $_ 当前文件名(不带目录) 。有一点总是很重要,那就是你不能改变函数中的 $_的值。 如果你改变了这个值,应该将它改回来。 程序清单 1 4 - 2 包含了另一个 F i l e: F i n d例子。这个例子用于删除 C:和 D :驱动器上带有 : 扩展名 . t m p 的所有文件。这些文件在你的硬盘上不断增加并变得拥挤不堪。你可以很容易使 用这个程序,从 UNIX系统中删除文件,或者执行各种文件维护操作。 程序清单 14-2 删除临时文件所用的程序 程序清单 14-2中的大多数程序与程序清单 14-1中的程序相似。 第7行:对传递过来的文件名进行测试,以确保它是个正规文件。请记住,这个子例程将 同时为文件和目录而调用。 第9~11行:对文件名进行核实,以了解文件名的结尾是否包含 .tmp 。如果包含 .tmp,则用 164 使用第二部分 高 级 特 性 下载 unlink 将件删除。 14.2.2 拷贝文件 另一个常见操作是拷贝文件,可以在 Perl中使用下列步骤执行这项操作: 1) 打开源文件,以便读取该文件。 2) 打开目标文件,以便写入。 3) 读取源文件并写入目标文件。 4) 关闭源文件和目标文件。 当然,在执行每个操作步骤后,必须确保没有发生任何错误,并且每个写入操作均取得 了成功。告诉你一个比较容易的方法, P e r l 提供了 F i l e: c o p y 模块,它能进行文件的拷贝操 : 作。下面是该模块的一个例子: 上面这个代码段用于将 sourcefile的内容拷贝到 destination 。如果拷贝成功, copy函数返回 1,如果拷贝出现问题,则返回 0,并且它会将变量 $!设置为相应的错误代码。 File : copy模块也提供了一个 move 函数。 move 函数能够将文件从一个目录移到另一个目 : 录。如果可以通过对文件改名来移动文件,那么该文件将被改名。当源文件和目标文件在同 一个文件系统或磁盘上时,通常采取改名的方法。如果无法通过对文件改名来移动文件,那 么文件首先拷贝到目标文件名,然后将原始文件删除。请看下面这个例子: 在上面的代码段中,文件 importont.doc从当前目录移到目标目录 d:/archives/documents 中。 如果 m o v e函数运行失败,那么就可能存在不完整的目标文件。如果 m o v e 运行失败, u n l i n k函 数能够删除部分拷贝的目标文件。 14.2.3 用于通信的Perl模块 P e r l模块的功能并不限于对文件和目录进行操作。还可以使用 N e t: P i n g模块来确定你的 : 系统是否能够在网络上正确地进行通信。 N e t: P i n g 模块是根据 U N I X实用程序 p i n g 而得名的,而实用程序 p i n g 又是根据潜水艇利 : 用声波来测定位置的“乒”声音而得名。 p i n g 实用程序将一个数据包发送到网络上的另一个 系统。如果该系统正在运行,那么它就会发出应答,同时 p i n g命令报告数据包发送成功。下 面显示的 Net: Ping的工作方式与上面完全相同: : 在上面这个代码段中,Net: Ping 模块提供了一函数叫做 pingecho。该函数拥有两个参数, : 165 第14学时 使 用 模 块使用 下载 第一个参数是要查找的主机,在上例中是 www.yahoo.com 。第二个参数用于指明 pingecho应该 等待多长时间才能收到对方的应答,这个时间以秒为单位计算。 由于 P e r l 在 Windows 95/98 / N T 上运行时所具备的性质,在撰写本书时 (1 9 9 9年夏季) N e t: P i n g 模块还不能运行。 N e t : P i n g需要依赖 a l a r m函数, : : 而在 Wi n d o w s下该函数不能运行。 A c t i v e s t a t e是开发在 Wi n d o w s下运行的 P e r l 的主要公司,它已宣布准备实现用于 Wi n d o w s的许多遗漏的功能,并将这些 修改纳入 Perl。 14.2.4 使用English模块 使用 English模块, Perl的某些无名的特殊变量将采用比较长的名字,如下例所示: 在上面的代码段中, while(< >) 通常从 S T D I N中读取一个行输入,并将它赋予 $ _ 。现在它 仍然如此。但是,使用 use English ,变量 $_ 也叫做 $ARG。下面显示了特殊变量及其对应的英 文变量的部分列表。 特殊变量 英文名 若要了解特殊变量及其对应的英文变量的完整列表,请查看 English模块的在线文档。 14.2.5 diagnostics模块 P e r l模块 d i a g n o s t i c s 能够帮助你查找程序中的错误。当你键入本书中的代码例子时, P e r l 解释程序肯定会发出你不太理解的出错消息。例如,请看下面这个短程序: 它使 Perl发出下面的警告消息: d i a g n o s t i c s 模块会使 P e r l具体说明它的错误和警告。可以修改这个示例程序,使它像下面 这样包含诊断模块: 166 使用第二部分 高 级 特 性 下载 修改后的程序能够输出一个文字更详细的诊断消息: 如果认真观察一下这两个消息,就会发现它们之间有着明显的关系。第一条消息的意思 很清楚, P e r l要求你的电子邮件地址应该写成 h e l p \ @ s u p p o r t . c o m 。第二条消息经过解释,变 得更加清楚了一些。由于 use strict 是有效的, @ s u p p o r t 变量应该已经用 m y 作了声明。但是 @support不是个变量,它是电子邮件地址的一部分,不过它被 Perl转换错了。 该消息前面的字母用于指明你遇到的是何种类型的错误。 W )表示是个警告, D)表示 ( ( 你使用了一个不该使用的语句, S )是个严重警告, ( F ) 表示这是个致命的错误。除了( F ) ( 之外的所有消息类型,你的 Perl程序都会继续运行。 P e r l 共有 6 0页用于描述它的出错消息。如果你在理解 P e r l 的简要出错消息时遇到了问题, use diagnostics 有时能够帮助你理解出错消息的含义。 通过浏览 p e r l d i a g 在线手册页,就可以看到出错消息和诊断消息的完整列 表。 14.3 标准模块的完整列表 关于 P e r l中包含的模块的完整列表,本书将不作详细的说明。下面是标准 P e r l 产品中的模 块列表及其简单的说明。如果想知道模块的作用以及它如何运行,请使用 p e r l d o c,以查看该 模块的文档资料。 模块名 AutoLoader AutoSplit Benchmark CGI CPAN Carp DirHandle Env Exporter ExtUtils: * : File: * : File : Spec: * : : FileCache FindBin Getopt: * : 说 明 允许 Perl只在需要时对函数进行编译 对模块进行分割,以便自动加载 允许对 Perl 函重复定时,以便加速基准测试 允许非常容易地访问用于 Web 编程的 Common Gateway Interface (公用 网关接口,第 17~24 学时介绍 ) 用于访问 Perl 模块的存档文件,以便安装新模块 生成出错消息 提供与目录句柄之间的对象接口 将操作系统的环境映射到变量中 允许你编写自己的模块 允许你编写自己的模块或者安装模块 提供更多的文件操作模块,如 File : Copy : 允许对文件名进行跨操作系统的操作 打开的文件数量可以超过操作系统通常允许的数量 找出当前正在运行的程序的名字 允许你处理程序中的命令行选项 167 第14学时 使 用 模 块使用 下载 (续) 模块名 I 1 8 N: C o l l a t e : IPC: * : Math: * : Net: * : Pod: * : Symbol Sys: Hostname : Sys: Syslog : Term: * : Text : Abbrev : Text : ParseWords : Text : Soundex : Tie : * : Time : * : constant integer Locale 说 明 允许按特定语言排序 用于进程间的通信,比如使用双通或三通管道进行通信 允许你使用带有任意精度浮点数、整数和复数的扩展数学运算库 允许你获得关于网络主机的信息。例如, N e t : h o s t e n t 可将 I P 地址 : (如 204.71.200.68 )转换成主机名(如 www.Yahoo.com) 用于访问 Perl 的 Plain Old Documentation 格式化例程 允许你对 Perl 自己的符号表进行查看和操作 用于获取你的系统的 IP 主机名 允许将信息写入 UNIX 系统的出错记录 为光标位置和清屏等提供终端控制的函数接口 创建缩写表 允许对文本进行分析,以便搜索单词 使用 Soundex 方法,根据标点对单词进行分类 将 Perl的变量与函数连接起来,使你可以实现自己的数组和哈希结构 允许对时间进行分析和处理。例如,你可以将“ Sat Jul 24 16:21:38 EDT 1999 ”这种格式的时间转换成 1970 年 1月 1 日以来的秒数 允许定义常量值 使 Perl 有时能够用整数而不是浮点数进行数学运算 允许进行基于语言的字符串比较(各国语言字符的字符串比较) 下一步进行的操作 如果你想免费了解能使用哪些种类的模块,请使用 We b 浏 览器,以便访问网址 h t t p : //www.cpan.org。模块按类别行大致的排列。 有些模块需要 C编译器和起码的开发环境来进行安装。在 Wi n d o w s计算机上可能没有这些 模块。 A c t i v e s t a t e 的 P e r l 包含一个名叫 P P M 的实用程序,它可以用来浏览和安装预安装的模 块。 本书的附录包含一个按步骤操作的说明,用于在 U N I X 和Wi n d o w s计算机上安装模块。这 些操作说明将告诉你如何使用 C PA N 模块(用于 U N I X )和 A c t i v e s t a t e 的用于安装新模块的 PPM实用程序。 14.4 课时小结 在本学时中,我们介绍了如何使用模块来扩展 Perl 语言的功能,以便执行许多其他的任务。 这种将新功能添加给 Perl的通用方法将在本书的其他学时内容中广泛使用。另外,本学时介绍 了一些常用的模块,并且给出了标准 Perl 产品包含的模块的完整列表。 14.5 课外作业 14.5.1 专家答疑 问题:在File : Find模块中,变量名中的双冒号(: )表示什么?它是否与 $File: Find: : : : : dir中的 相同? 解答: Perl模块能够为变量名建立一些备用区域,称为名空间,这样,模块的全局变量名 168 使用第二部分 高 级 特 性 下载 与你自己的全局变量名就不会混淆在一起了。因此在 Cwd模块中的全局变量将称为 $Cwd: x。 : 你的大多数全局变量实际上拥有 $main : x这个全名,而不是简名 $x。不过就目前来说,这并 : 不重要。 问题: 我有一台安装了 Windows 95/98/NT 的计算机,我想使用的模块无法通过 Activestate 的PPM实用程序进行安装。我应该如何安装该模块? 解答: 很遗憾, CPAN 的大多数模块要求你拥有完整的 U N I X 型开发环境,可以对模块进 行编译和安装,这种环境在 Windows计算机上很难安装。如果你能够非常方便地使用 C 编译器, 则可以下载一个开发环境,创建你自己的模块,但是这样做并不容易。 问题: 我有一个包含 require而不是 use的老式 Perl 程序。 require的功能是什么? 解答: r e q u i r e 语句与 u s e 相类似。由于 Perl 4 没有 u s e 关键字,它使用的是 r e q u i r e。r e q u i r e 语句可使解释程序查找一个库文件,并将它纳入你的程序,这个功能类似 u s e的功能。但是它 们之间的主要差别是:每当 require语句在运行时(运行期) ,便执行 require功能;而 use命令则 是在你的程序第一次加载(编译时)时执行其功能。 14.5.2 思考题 1) 如果你想在程序中两次使用 cwd函数,应该使用 use Cwd; 几次? a. 一次。 b. cwd 的每个实例使用一次,因此是两次。 c. 一次也不用,因为 cwd是个内置函数。 2) 什么模块能够为 $_变量提供一个别名? a. LongVars b. English c. $_ 没有别名 14.5.3 解答 1) 答案是a。当你用use将模块插入你的程序后,它的所有函数均可供程序的其余部分使用。 2) 答案是 b。use English 使得 $_可以使用别名 $ARG。 14.5.4 实习 • 请翻到本书的附录,设法按照那里的说明,通过 CPAN安装模块 Bundle : LWP。对于第 : 24学时中的代码例子来说,需要使用该组模块中的一个模块。 ...
View Full Document

Ask a homework question - tutors are online