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 "\n";
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 "\n";
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 "\n"; 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