Exporter - 实现默认的导入方法用于模块
简介:
In module YourModule.pm:
package YourModule;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(munge frobnicate); # symbols to export on request 导出的符号
Vsftp:/root/perl/7# cat scan1.pm
package scan1;
require Exporter;
@ISA = qw(Exporter);
@EXPORT_OK = qw(fun1 frobnicate); ###导出fun1函数
sub fun1() {
my $a=shift;
my $b=shift;
return 67 + $a + $b;
};
Vsftp:/root/perl/7# cat a7.pl
unshift(@INC,"/root/perl/7");
use scan1 qw(fun1);
my $var=&fun1(3,4);
print $var;
print "
";
Vsftp:/root/perl/7# perl a7.pl
74
package YourModule;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(munge frobnicate); # symbols to export on request
Vsftp:/root/perl/7# cat scan02.pm
package scan02;
use Exporter 'import'; # gives you Exporter's import() method directly
@EXPORT_OK = qw(fun2 frobnicate); # symbols to export on reques
sub fun2() {
my $a=shift;
return $a -2;
};
1;
Vsftp:/root/perl/7# cat a8.pl
unshift(@INC,"/root/perl/7");
use scan02 qw(fun2);
my $var=&fun2(10);
print $var;
print "
";
Vsftp:/root/perl/7# perl a8.pl
8
描述:
Exporter 模块实现一个简单的方法 允许一个模块来导出函数和变量到它用户的名字空间。
很多模块使用Exporter 而不是实现他们自己的导入方法
因为Exporter提供了 一个 高度灵活的接口.
Perl 自动调用import 方法 当处理一个使用的声明对于一个模块,
模块使用时在perlfunc and perlmod中说明。
了解模块的内容和如何使用语句 是重要的对于了解Exporter
如何Export
数组 @EXPORT and @EXPORT_OK 在一个模块里持有符号的列表,准备导出到用户的名字空间默认情况下,
或者它们可以请求被导出,分别的。
符号可以代表函数,标量,数组,hashes 或者符号表。
符号必须是全名 ,函数前的&是可选的
@EXPORT = qw(afunc $scalar @array); # afunc is a function
@EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
如果你只是希望导出函数名字 推荐省略&,这种方式是更快的
选择需要导出的
不要导出方法名字!
不要导出任何除非是默认的
Exports 污染模块用户的名字空间, 如果你必须export 尝试使用@EXPORT_OK优先于@EXPORT
避免短的或者公用的符号名字来创建名字冲突的风险
通常 任何不被导出是访问可以从模块外部访问 使用YourModule::item_name (or $blessed_ref->method)
Vsftp:/root/perl/7# cat scan02.pm
package scan02;
sub fun2() {
my $a=shift;
return $a -2;
};
1;
Vsftp:/root/perl/7# cat a9.pl
unshift(@INC,"/root/perl/7");
use scan02 ;
my $var=&scan02::fun2(10);
print $var;
print "
";
Vsftp:/root/perl/7# perl a9.pl
8
按惯例 你可以使用一个下划线在名字前来表明它们是内部的 不是公用使用的
它实际是得到私有函数通过:
my $subref = sub { ... };
$subref->(@args); # Call it as a function
$obj->$subref(@args); # Use it as a method
然而你可以使用它们的方法 由你来弄清楚 如何继承工作
作为一个一般性规则,如果模块是尝试被面向对象的那么export nothing.
如果它只是一个函数的集合 那么 @EXPORT_OK 任何除了使用谨慎使用@EXPORT
如何导入:
从其他文件 你希望使用你的模块 有3个基本的方式用来加载你的模块和导入他的符号:
use YourModule;
这个导入所有的符号 从 YourModule's @EXPORT 到你的名字空间
use YourModule ();
这个导致Perl来加载模块但是不导入任何符号
use YourModule qw(...);
这个只导入 列出的符号通过调用者到它们的名字空间。
所有列出的符号必须在你的r @EXPORT or @EXPORT_OK, 否则一个错误发生。
高级功能;
指定导入的列表:
如果 条目的任何在一个导入的列表开始以!, : or / 那么列表是对待为一个特定的系列,
从列表添加或者删除来导入, 他们处理是从左到右的 特定的格式
[!]name This name only
[!]:DEFAULT All names in @EXPORT
[!]:tag All names in $EXPORT_TAGS{tag} anonymous array
[!]/pattern/ All names in @EXPORT and @EXPORT_OK which match
以!开始的 表明 匹配的名字应该是从列表中删除来导入。
如果第一个指定的是一个删除 他是对待为之前通过 :DEFAULT.
如果你需要导入额外的名字除了默认设置 你希望仍旧包含 :DEFAULT