perl模块指南 (zz)

转载 2007年05月11日 14:14:00

zz from http://fanqiang.chinaunix.net/program/perl/2005-06-28/3349.shtml

 

是否觉得perl中关于模块的文档有些难懂?好的,这里有一个世界上最简单的模块,它将用于展示(demonstrate)Exporter模块所有的特性,另外还有一段使用这个模块的脚本。同时,我们也会给出一个有关于@INC的简短说明,最后,还要讲一下有些关于using warnings和use模块的使用。

下面是这个模块的内容:

MyModule.pm

package MyModule;

use strict;
use Exporter;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);

$VERSION     = 1.00;
@ISA         = qw(Exporter);
@EXPORT      = ();
@EXPORT_OK   = qw(func1 func2);
%EXPORT_TAGS = ( DEFAULT => [qw(&func1)],
                 Both    => [qw(&func1 &func2)]);

sub func1  { return reverse @_  }
sub func2  { return map{ uc }@_ }

1;

首先,我们将通过声明 "package" 名字来获得一个名字空间。这将确保模块中的方法与变量,和调用他们的代码所分隔开来。 use strict在模块中是一个非常好的做法,这将使Perl对使用全局变量做出一定的约束。详细介绍参看 "use strict warnings and diagnostics or die"

我们需要用Exporter模块来将我们的函数从MyModule::namespace输出到main::namespace,让使用MyModule的程序可以使用这些函数。 为了use strict,我们必须使用use vars来声明一些变量。当然,在5.6版本以上我们还可以使用our来声明变量。 我们现在设置一个$VERSION数值,然后通过使用@ISA来使得Exporter成为MyModule的一部本。想要了解@ISA是什么以及如何使用等细节,请参考"perlboot"

@EXPORT包含了我们需要默认输出的函数列表。在这里,它是空的。一般来说,你通过默认的使用@EXPROT输出的越少越好。因为调用该模块的程序中,有可能存在与其中函数相之冲突的函数或者代码。如果程序需要调用某个指定的函数,那么,就请就让它主动请求。 @EXPORT_OK包含了我们在调用时需要输出的函数列表,我们只输出了&func1和&func2,这种方法要优先于盲目地使用@EXPORT来输出函数。你也可以输出像$CONFIG这样全局的、不是用my定义的字义范畴的变量。(可参考用 "our" 或者 use vars来声明全局变量) %EXPORT_TAGS.为了方便起见,我们定义了两套输出标签。‘:DEFAULT’标签只输出&func1;‘:Both’标签则输出&func1和&func2。这个哈希表存储指向数组引用的标签。注意:在这里的数组是匿名的。 最后,我们需要在模块结尾加上一个“1;”。因为当perl装载一个模块时,它会实现查看这个模块是否能在最后返回一个真值,并且据此判断该模块是否已装载成功。当然,你可以在最后面添加任何真值(参看 "Code::Police" ),但其中1是最方便的。

MySciprt.pl(使用MyModule的一个例子)

#!/usr/bin/perl -w

use strict;

# you may need to set @INC here (see below)

my @list = qw (J u s t ~ A n o t h e r ~ P e r l ~ H a c k e r !);

# case 1
# use MyModule;
# print func1(@list),"/n";
# print func2(@list),"/n";

# case 2
# use MyModule qw(&func1);
# print func1(@list),"/n";
# print MyModule::func2(@list),"/n";

# case 3
# use MyModule qw(:DEFAULT);
# print func1(@list),"/n";
# print func2(@list),"/n";

# case 4
# use MyModule qw(:Both);
# print func1(@list),"/n";
# print func2(@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的注意事项* 当你提交一个use MyModule的时候,就会指示perl去搜索@INC数组中是否有此模块名。@INC通常包含:

/perl/lib 
/perl/site/lib
.

“.”这个目录表示当前的工作目录。核心模块是安装在perl/lib目录中,非核心模块安装在perl/site/lib目录中。你可以向@INC中添加自定义目录。像下面这样:

BEGIN { push @INC, '/my/dir' }
# or
BEGIN { unshift @INC, '/my/dir' }
# or
use lib '/my/dir';

我们需要使用BEGIN块在编译时向@INC中添加值,此时是perl检查模块的时刻。

如果你等到程序被编译的时候就太晚了,perl会抛出一个异常,说“在@INC中无法找到MyModule”.使用push还是unshift方法添加值的区别是,perl搜索@INC的顺序是从@INC中的第一个目录开始的。如果你在/perl/lib/、/perl/site/lib/和./中都有一个MyModule模块的话,那么/perl/lib中的模块将首先被找到并使用。use lib用法可以起到和BEGIN{unshift @INC,$dir}一样的效果-请参看"perlman:lib:lib":http://www.perlmonks.org/?node=perlman%3Alib%3Alib . *use Foo::Bar意味着什么* use Foo::Bar并不意味着在@INC的目录中寻找一个叫做Foo::Bar.pm的模块文件。它的意思是在@INC的目录中寻找一个叫做‘Foo’的“子目录”,然后在其中找一个叫做“Bar.pm”的“模块”。 现在,如果我们成功"use"了一个模块,那么我们就可以通过完整的包路径语法&PACKAGE::FUNCTION使用这个模块中的所有函数。当我们说&Foo::Bar::some_func的时候,我们指的是“包的名字”而不是那个在use中曾使用的包含路径的文件名。这会允许你可以在一个use过的文件中包含很多包名字。实际使用中这些名字通常是相同的。

use warnings;

你应该打开warnings来检测你的模块,因为它可以检测出很多细微的错误。你可以通过在测试模块代码中添加-w参数来打开警告选项。如果你在模块中添加了use warnings,那么你的模块必须要求运行在perl5.6以上,否则不支持。如果你在模块的顶端添加了$^W++,那么你将会在全局范围内打开警告选项-这将影响到其他模块,你最好只在你自己的程序中这么使用,因为这略显霸道了一些。这有一个专家写的叫做"tye":http://www.perlmonks.org/?node=tye 的代码来测试警告选项,但没有直接将它包含进他/她自己的模块中。 希望这些会讲清楚它是怎样工作的。 :) tachyon

 

perl模块(创建模块,加载模块详解)

如何创建和加载perl模块,深入理解perl模块如何创建和加载perl模块深入理解perl模块 加载模块 1 编译阶段加载模块使用use 2 运行阶段加载模块使用require 3 使用no 创建模块...
  • Aggressive_snail
  • Aggressive_snail
  • 2017年02月22日 18:38
  • 1583

Linux上安装Perl模块的两种方法

Linux/Unix下安装Perl模块有两种方法:手工安装和自动安装。第一种方法是从CPAN上下载   您需要的模块,手工编译、安装。第二种方法是联上internet,使用一个叫做CPAN的模块自动完...
  • ding_shan
  • ding_shan
  • 2016年03月21日 15:08
  • 1071

perl模块之Rex(本地安装)

前言 由于环境限制,需要安装的机器不可以上网,如果可以连网,请参考官网文档,以下所有操作都是root(如果没有root,编译的时候需要有一些修改),OS:suse11sp2,其实大部分linux...
  • xshalk
  • xshalk
  • 2014年05月16日 13:43
  • 1460

Linux下使用CPAN进行Perl模块的安装

当我们想使用某些Perl模块的时候,很可能会遇到当前系统不存在这个模块的情况,这时我们可以通过使用CPAN来对相应的模块进行获取,下面就介绍一下CPAN的使用方法。 首先,我们可以用perl -e ...
  • zhang_yang_43
  • zhang_yang_43
  • 2017年04月02日 07:53
  • 1643

Bugzilla:安装Perl 模块失败的解决办法

先说下为什么出现Perl模块安装失败,一般情况下网络上的Bugzilla安装教程都是通过网络进行的,网络安装的优势很明显,但同样的缺点也很明显,那就是对网络的依赖性高。依赖网络其实没啥不好的,但问题是...
  • qq445803843
  • qq445803843
  • 2015年04月03日 00:07
  • 2405

非[无]root权限 服务器 下安装perl以及perl模块

转载自http://www.zilhua.com 在本博客中,所有的软件安装都在服务器上,且无root权限。理论上适合所有 Linux服务器非root权限下安装perl以及perl模块...
  • nayishunjian13
  • nayishunjian13
  • 2016年12月27日 09:39
  • 1460

Perl--DBI模块入门(一)

Perl--DBI模块入门
  • herokoking
  • herokoking
  • 2017年03月03日 09:29
  • 270

Perl 安装及模组安装方法【windows】

首先给出Perl 的官方网址: http://www.perl.org 本篇会阐述的问题主要有: 1. Perl, ActiveStatePerl,Strawberry Perl 的区别和联系 ...
  • oscar999
  • oscar999
  • 2013年11月21日 12:27
  • 16907

Perl脚本中Expect模块的学习使用

Expect模块可以用来向需要交互执行的程序输入必要的信息。以脚本形式实现交互式应用程序的语言。代码:$exp = new Expect;new一个Expect.$exp->spawn($comman...
  • jichenchen1990
  • jichenchen1990
  • 2017年07月25日 11:22
  • 565

perl DBI模块和DBD-mysql模块安装

首先,来一段代码来自NinGoo的检测系统中已经安装的Perl模块: [root@rh65sql1 tmp]# cat check_module.pl #!/usr/bin/perl use Ex...
  • u010587433
  • u010587433
  • 2015年07月01日 11:47
  • 1035
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:perl模块指南 (zz)
举报原因:
原因补充:

(最多只允许输入30个字)