zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    后端程序员写的前端js代码模板
    setTimeOut传參数
    IP地址的分类——a,b,c 类是怎样划分的
    适配高分辨率的图片High DPI Images for Variable Pixel Densities
    atitit.提升软件开发效率大的总结O5
    Android Binder总结
    Enable Notepad++ 666 support both SCLEX_FORTRAN and SCLEX_F77
    client怎样调用IBinder接口对象
    文件系统损耗平衡算法
    u-boot支持yaffs映像烧写的补丁
  • 原文地址:https://www.cnblogs.com/hzcya1995/p/13350010.html
Copyright © 2011-2022 走看看