我不明白 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\n";
do_awesome_thing(); #works
print "\n"; print "be_awesome\n";
print be_awesome(); #doesn't work
print MyPackage::be_awesome(); #works
print "\n";
[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 会更加的礼貌不会导出任何东西

use EXPORT和use EXPORT_OK的更多相关文章

  1. Exporter - 实现默认的导入方法用于模块

    Exporter - 实现默认的导入方法用于模块 简介: In module YourModule.pm: package YourModule; require Exporter; @ISA = q ...

  2. perl模块

    查看perl模块安装目录:find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print 为什么要写或要模块呢?简言之:代码重用,更多见于写一组工具集,有很多地方是 ...

  3. perl EXPORT模块

    Exporter - Implements default import method for modules 实现模块的默认导出方法: 简介: [tomcat@wx03 ~]$ cat hui.pm ...

  4. Perl中神奇的@EXPORT

    @EXPORT Perl通过继承,可以使子类可以像使用本地方法一样使用其基类的方法. 一个类如果想把自己的方法(变量)暴露给别人使用(比如一些公共基础类的的通用方法或变量),还可将直接将方法(变量)添 ...

  5. 4.Android 打包时出现的Android Export aborted because fatal error were founds [closed]

    Android 程序开发完成后,如果要发布到互联网上供别人使用,就需要将自己的程序打包成Android 安装包文件(Android Package,APK),其扩展名为.apk.使用run as 也能 ...

  6. Android中的Libraries以及Order and Export的使用。

    1Add JAR 从Eclipse的现有所有工程中,添加jar包到该工程下 2Add External JARs 从Eclipse外的其他的位置,添加jar包到该工程下 3Add Variable 增 ...

  7. linux定时任务crond export变量问题

    linux定时任务crond export变量问题 1)我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器,于是就在 crontab里配置了如下内容: 50 17 ...

  8. javascript export excel

    <input type="button" onclick="tableToExcel('tablename', 'name')" value=" ...

  9. SharePoint 2010 Survey的Export to Spreadsheet功能怎么不见了?

    背景信息: 最近用户报了一个问题,说他创建的Survey里将结果导出成Excel文件(Export to spreadsheet)的按钮不见了. 原因排查: 正常情况下,这个功能只存在于SharePo ...

随机推荐

  1. Objective-C 程序设计第四版

    1,@class  XYPoint; 写在.h文件里,告诉编译器有这类,然后用的时候,其实是在.m文件引入的. 例如.#import “XYPoint.h”  然后在.m文件里就能用XYPoint.h ...

  2. 编译:一个 C 程序的艺术之旅(转载)

    C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理.编译.汇编.链接这四道工序?让我们从这段简单的 C 程序开始. 为什么要编译 这并不是一个简单的问题.我们知道 ...

  3. mmc一维下料例子

    数据来自维基, 长度 = 5600; l切割长度= {1380, 1520, 1560, 1710, 1820, 1880, 1930, 2000, 2050, 2100, 2140,     215 ...

  4. uva11178 Morley’s Theorem(求三角形的角三分线围成三角形的点)

    Morley’s Theorem Input: Standard Input Output: Standard Output Morley’s theorem states that that the ...

  5. Treasure Exploration(二分最大匹配+floyd)

    Treasure Exploration Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 7455   Accepted: 3 ...

  6. Linq实现t-Sql的各种连接

    在ORM框架大行其道的今天,对于.net行业的人,想要学好EF,那Linq的学习在势在必行啊.今天总结下平时比较常用的表连接的用法. Inner Join Linq: var list = (from ...

  7. c++ , const对象中的变量不能被修改

    const对象中的变量不能被修改,即使const对象中的函数也不能修改该对象中的变量值 #include <iostream> using namespace std; //------- ...

  8. C#构架之基础学习----动态添加窗体和 控件

    仿照窗体应用程序编写: 任务一:生成一个Form类的窗体对象frm using System.Windows.Forms;         //using指令使用Form对象创建所需的命名空间 //如 ...

  9. spring-mvc关键点掌握 high level

    在本例中,我们将使用Spring MVC框架构建一个入门级web应用程序.Spring MVC 是Spring框架最重要的的模块之一.它以强大的Spring IoC容器为基础,并充分利用容器的特性来简 ...

  10. sizeof,一个其貌不扬的家伙(转)

    sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下.但当我总结的时候才发现,这个问题既可以简单,又可以 ...