zoukankan      html  css  js  c++  java
  • use EXPORT和use EXPORT_OK

    我不明白 use EXPORT和use EXPORT_OK的区别,大多数资料提到了一些:
    
    @Export 允许 导出模块的函数和变量到用户的名字空间使用标准的导入方法。
    
    这种方式,我们不需要创建模块的对象来访问它的成员。
    
    @EXPORT_OK  导出选择的模块的符号列表(子函数和变量)
    
    但是确实没有看到差别, 能有人提供一个小的基本的额例子 来说明2个符号的差异?
    
    你不应该导出很多符号默认情况下,
    
    
     @EXPORT会通常小的和空的
     
     @EXPORT_OK 可以包含更多
     
     比如  Encode 导出encode和decode 默认(@EXPORT)
     
     但是不是is_utf8(@EXPORT_OK)
    
    我们有一个package Mypackage 使用@EXPORT:
    
    #this is MyPackage.pm
    package MyPackage;
    @EXPORT = qw(do_awesome_thing);
    
    sub do_awesome_thing { ... }
    
    sub be_awesome { ... }
    
    现在,当我使用MyPackage 在我的代码里:
    
    
    #this is myscript.pl
    use MyPackage;
    
    do_awesome_thing(); #works
    
    be_awesome(); #doesn't work
    MyPackage::be_awesome(); #works
    
    do_awesome_thing  自动导除到我的代码从MyPackage,
    
    不需要我说 "give this to me"
    
    be_awesome  没有被导出(它也不会被@EXPORT_OK 导出)
    
    [root@wx03 0519]# cat a1.pl 
    unshift(@INC,"/root/test/0519"); 
    use MyPackage;
    print "do_awesome_thing
    ";
    do_awesome_thing(); #works
    print "
    ";
    
    print "be_awesome
    ";
    print be_awesome(); #doesn't work
    print MyPackage::be_awesome(); #works
    print "
    ";
    [root@wx03 0519]# perl a1.pl 
    do_awesome_thing
    100
    
    be_awesome
    Undefined subroutine &main::be_awesome called at a1.pl line 8.
    
    
    换句话说,如果一个package叫做MyOtherPackage  使用 @EXPORT_OK
    
    #this is MyOtherPackage.pm
    package MyOtherPackage;
    @EXPORT_OK = qw(do_awesome_thing);
    
    sub do_awesome_thing { ... }
    
    sub be_awesome { ... }
    and then try
    
    #this is mynewscript.pl
    use MyOtherPackage;
    
    do_awesome_thing(); #doesn't work
    MyOtherPackage::do_awesome_thing(); #works, as always
    
    调用 do_awesome_thing  直接不工作,因为放置一些到@EXPORT_OK
    
    是说 给这个倒我的用户只有当他们需要他的时候
    
    因为我们只是需要 MyOtherPackage  没有明确的要求do_awesome_thing 被导入
    
    它不会被导入,只能通过指定的包名访问
    
    
    [root@wx03 0519]# cat MyOtherPackage.pm 
    package MyOtherPackage;
    use Exporter 'import';
    @EXPORT_OK = qw(do_awesome_thing);
    
    sub do_awesome_thing { print 100; }
    
    sub be_awesome { print 200; }
    
    
    [root@wx03 0519]# cat a2.pl 
    use MyOtherPackage;
    
    do_awesome_thing(); #doesn't work
    MyOtherPackage::do_awesome_thing(); #works, as always
    [root@wx03 0519]# perl a2.pl 
    Undefined subroutine &main::do_awesome_thing called at a2.pl line 3.
    
    
    导入 do_awesome_thing 使用MyOtherPackage qw(do_awesome_thing) 
    
    在第2行  这个是说导入模块和让do_awesome_thing  直接可用
    
    [root@wx03 0519]# cat a2.pl 
    use MyOtherPackage qw(do_awesome_thing);
    
    do_awesome_thing(); #doesn't work
    MyOtherPackage::do_awesome_thing(); #works, as always
    [root@wx03 0519]# perl a2.pl 
    100100[root@wx03 0519]# 
    
    
    值得注意的是用户可以指定use MyPackage qw(do_awesome_thing) 
    
    在第一个package中, 在这种情况下, 在@EXPORT列表中的其他都不会导出。
    
    只有do_awesome_thing会, 在默认情况下,
    
    任何在@EXPORT 里的东西会自动扔进到用户的脚本里,
    
    而@EXPORT_OK 会更加的礼貌不会导出任何东西
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

  • 相关阅读:
    类的继承和方法重写
    引用地址的变化
    Java中代码块执行顺序
    冒泡排序实现原理
    JSP九大内置对象
    SSH框架运行流程
    springboot + maven 整合SSM
    Maven创建项目,Index.jsp报错
    一些js在线引用文档
    excel出现虚线怎么去掉?
  • 原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6200017.html
Copyright © 2011-2022 走看看