创建你的第一个Perl模块

ZDNet软件频道 时间:2002-04-08 作者:ZDNET CHINA 特稿 |  我要评论()
本文关键词:perl
想必谁都希望把自己亲手编写的、自认为最好的实用程序转换为能以CPAN共享方式使用的模块。好,往下读,本文就将向读者解释创建Perl模块所包含的步骤。

perl程序写够了没有?现在到了需要创建模块的时候了。你可能曾利用过Comprehensive perl Archive Network(CPAN)开发的高质量代码模块,怎么样?想不想自己也来造几个模块?想必谁都希望把自己亲手编写的、自认为最好的实用程序转换为能以CPAN共享方式使用的模块。好,往下读,本文就将向读者解释创建perl模块所包含的步骤。

为什么要创建模块

为什么值得把代码编进模块?主要有以下原因:首先,你需要在很多场合下重用这些代码。其次,使面向对象技术成为保存你聪明才智的防御行动。再次,你需要编写经过良好定义的接口同时还能增加新内容;最后,你想通过某种简单方法能对你的数据集合进行操作同时仍然具有无须破坏旧代码即可重新编写的灵活性。好的,面向对象就能实现以上的一切目标。只要你始终支持同一接口,你就能在对象内按照你喜欢的任何方法对其进行修改。

开始

创建模块的第一步是为你的代码创建一个工作目录。然后是创建基本的模块文件,其中包括了主要的perl模块:.pm文件,此外还可能会包括一个Test.pl脚本和创建文件。只要拥有了主模块脚本文件,你就可以设置Importer以及其他常用工具要采用的标准变量。

听起来要做的工作好象满多的,但你够幸运的了。由于以上的工作都是人们在开发过程中需要反复进行的,因此有人把这个过程自动化了。自动化工具同perl一道缺省安装。有关的程序是h2xs。它最早的任务是把C程序头转换为perl模块代码从而扩展perl,但你可以略过这一步只是用它来建立你的基本模块框架。

这里要运行的命令是h2xs –ACXnMyModule,当然你可以用自己喜欢的名字替代MyModule。该程序会创建一个目录,这就是运行程序的场所。目录名采自你的模块名,程序会在该目录下创建几个简单文件。参数ACX的作用是关闭AutoLoading。下面要讨论的关键文件是MyModule.pm,基本的模块文件内容由清单A所示。

模块文件基础

程序中的第一行是包声明。等于告诉perl:本声明之后的其他所有代码都属于某个名称空间。默认地。你编写的所有代码都在主名称空间内。这样,一个名叫blah()的子程序就会当作main::blah()来使用。例如,在名称空间里放子程序(以及除了全局变量以外的其他变量)就可以让perl把Painter 模块中的is_it_blue ()函数同Emotion模块中的同名函数区分开来。采用名称空间就等于要求perl保护你的代码并把它同一个对象联系起来。

程序代码清单A中的第二行是use 5.00x; ,该行代码定义了代码所能采用的最低perl版本。在其它场合测试代码之后你随时可以降低这个版本号,现在先不搭理它。代码中还包括use strict;以及 use warnings;等语句。这些代码相当重要,无论怎样强调都不为过。你所编写的代码应该是明晰、安全的代码,这是编写模块的要义。

最后一节装载Exporter并且设置一些变量。@ ISA 数组列出了perl应该寻找的其他对象包,借此可以找出你的对象上可用的方法。请把Exporter作为列表中唯一的条目以便模块一开始执行就可以调用模块内的import/export方法。出于程序员编程和执行程序的方便,后面的3个变量列出了模块中你想导入到主包的条目。到现在为止不要动这些代码,不过以后可能会用到它们。最后,在模块可以运行并要用到它之前,我建议你在多个perl版本上反复测试代码。

添加构造器

首先要增加一个构造器方法。所谓构造器就是创建并且返回一个新对象的子程序。其实真正要做的不过是创建一个变量并且返回对该变量的索引。总的来说,你还可以进一步初始化你将来需要的任何数据。这个子程序通常命名为new,但这也只是一个习惯,你也可以起个别的什么名字。如果你曾经用过DBI模块与数据库接口,你可能注意到它的构造器是被称为login的一个子程序。

几乎在任何场合下都需要为你的对象创建一个hashref。有可能是你将预先设置的值,你的构造器可能会接受一些初始值,至少是可选的。如果你始终采用面向对象的开发思路,你可能已经为初始化你的数据集而编写了相应的子程序。

perl把你的hashref当作一个对象是相当简单的。你用bless命令“祝福”它即可,这样就可以保证编译器能安全地调用你的方法。采用bless还有些其他方法,不过目前我们只是出于示例目的,只针对初始化对象。
sub new {
my $self = { INIT => 1, RED => 0, BLUE => 0, GREEN => 0 };
bless $self;
}

添加代码

把你的方法添加到模块是很容易的。每个方法都仅仅是一个子程序,而且这种子程序知道其第一个参数是一个对象。因为你处于模块之内,而且你“bless”了任何对象,所以你能信任它至少是由你的构造器之一生成的。你甚至还可以从你的模块以内调用其他方法。清单B即是一例。

封装

添加需要的方法而且至少有了一个构造器之后就没什么工作需要做了。现在你用数字1来结束你的代码,这样在perl编译代码时,模块将返回一个真正的数值。等于帮助perl检查代码是否出现了错误。另外,h2xs在你的代码末尾添加了好些一目了然的文档。有了它,任何阅读你代码的人都将感谢你的。不过得注意了,你要是没有修改缺省的文本人家会取笑你太懒了。

你能在大多数平台上编译并安装自己的模块并进行测试。如果你愿意,还可以编辑h2xs脚本中包括的Test.pl脚本,然后在你安装它之前测试模块。现在,你不妨去阅读方便的文档教程perldoc perltoot掌握更多有关自己模块的知识。除了在模块中封装代码之外面向对象还包括了更丰富的内容,当你正确掌握了perl模块编写之后就会逐渐入门道的。

责任编辑:超凡

百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134