2006-10-13

Perl简单模块指南

来源: 中国本站网 作者:佚名 评论 0 条
 


下面是这个模块的内容:

MyModule.pm
packageMyModule;usestrict;useExporter;usevarsqw([qw(&func1)],Both=>[qw(&func1&func2)]);subfunc1{returnreverse@_}subfunc2{returnmap{uc}@_}1">$VERSION@ISA@EXPORT@EXPORT_OKEXPORT_TAGS);$VERSION=1.00;@ISA=qw(Exporter);@EXPORT=();@EXPORT_OK=qw(func1func2);EXPORT_TAGS=(DEFAULT=>[qw(&func1)],Both=>[qw(&func1&func2)]);subfunc1{returnreverse@_}subfunc2{returnmap{uc}@_}1;
首先,我们将通过声明"package"名字来获得一个名字空间。这将确保模块中的方法与变量,和调用他们的代码所分隔开来。usestrict在模块中是一个非常好的做法,这将使Perl对使用全局变量做出一定的约束。具体介绍参看"usestrictwarningsanddiagnosticsordie"。
我们需要用Exporter模块来将我们的函数从MyModule::namespace输出到main::namespace,让使用MyModule的程序可以使用这些函数。为了usestrict,我们必须使用usevars来声明一些变量。当然,在5.6版本以上我们还可以使用our来声明变量。我们现在设置一个$VERSION数值,然后通过使用@ISA来使得Exporter成为MyModule的一部本。想要了解@ISA是什么以及如何使用等细节,请参考"Code::Police"),但其中1是最方便的。

MySciprt.pl(使用MyModule的一个例子)
#!/usr/bin/perl-wusestrict;#youmayneedtoset@INChere(seebelow)my@list=qw(Just~Another~Perl~Hacker!);#case1#useMyModule;#printfunc1(@list),"n";#printfunc2(@list),"n";#case2#useMyModuleqw(&func1);#printfunc1(@list),"n";#printMyModule::func2(@list),"n";#case3#useMyModuleqw(:DEFAULT);#printfunc1(@list),"n";#printfunc2(@list),"n";#case4#useMyModuleqw(:Both);#printfunc1(@list),"n";#printfunc2(@list),"n";
正如上面所见,我们在MyScript.pl中使用了MyModule。把中间的注释符号都去掉来看看会发生什么。一次都去掉即可。Case1:因为我们的模块默认什么都没有输出(没有输出&func1和&func2),所以我们会得到一个他们在main::namespace中不存在的错误。Case2:这个运行正常。我们让模块输出了&func1,于是我们可以正常使用它。尽管我们没有输出&func2,但是我们使用的是&func2完整的包路径,所以它也可以正常工作。Case3:‘:DEFAULT’标签应该输出&func1,所以你应该希望返回一个缺少&func2函数的错误。但事实上perl却偏偏找上了&func1的麻烦(错误信息提示未定义&func1函数)。恩,这里怎么了呢?原来,DEFAULT这个标签名字是非凡的,在我们的模块中,EXPORT_TAGS哈希表它会被自动设置成这样DEFAULT=>@EXPROT.也就是说,DEFAULT默认导出的是来自@EXPROT数组的函数。Case4:我们指定通过‘:Both’标签实现两个函数都输出,他实现了。*关于@INC的注重事项*当你提交一个useMyModule的时候,就会指示perl去搜索@INC数组中是否有此模块名。@INC通常包含:
/perl/lib/perl/site/lib.
“.”这个目录表示当前的工作目录。核心模块是安装在perl/lib目录中,非核心模块安装在perl/site/lib目录中。你可以向@INC中添加自定义目录。像下面这样:
BEGIN{push@INC,'/my/dir'}#orBEGIN{unshift@INC,'/my/dir'}#oruselib'/my/dir';
我们需要使用BEGIN块在编译时向@INC中添加值,此时是perl检查模块的时刻。
假如你等到程序被编译的时候就太晚了,perl会抛出一个异常,说“在@INC中无法找到MyModule”.使用push还是unshift方法添加值的区别是,perl搜索@INC的顺序是从@INC中的第一个目录开始的。假如你在/perl/lib/、/perl/site/lib/和./中都有一个MyModule模块的话,那么/perl/lib中的模块将首先被找到并使用。uselib用法可以起到和BEGIN{unshift@INC,$dir}一样的效果-请参看"perlman:lib:lib":http://www.perlmonks.org/?node=perlman:lib:lib.*useFoo::Bar意味着什么*useFoo::Bar并不意味着在@INC的目录中寻找一个叫做Foo::Bar.pm的模块文件。它的意思是在@INC的目录中寻找一个叫做‘Foo’的“子目录”,然后在其中找一个叫做“Bar.pm”的“模块”。现在,假如我们成功"use"了一个模块,那么我们就可以通过完整的包路径语法&PACKAGE::FUNCTION使用这个模块中的所有函数。当我们说&Foo::Bar::some_func的时候,我们指的是“包的名字”而不是那个在use中曾使用的包含路径的文件名。这会答应你可以在一个use过的文件中包含很多包名字。实际使用中这些名字通常是相同的。
共2页: 上一页 1 [2] 下一页

(本文仅表明作者个人观点,不代表本站及其管理员立场.) 推荐 收藏 投稿 打印 返回 关闭
上一篇:做一个打不死的个人站长  
下一篇:受限制环境安装Perl模块方法
    评论加载中…
 推荐文章
     

网站首页  -  网站地图 -   站长论坛  -  网站投稿  -    -  网站管理
Copyright © 2008 芜湖站长站 All Rights Reserved 皖ICP备07500611号