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