Exporter

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

原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6198965.html