加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在perl中导出vs export_ok

发布时间:2020-12-15 21:18:50 所属栏目:大数据 来源:网络整理
导读:我不明白EXPORT_OK vs EXPORT有什么区别/用例。 大多数资源都提到了以下几点: @Export allows to export the functions and variables of modules to user’s namespace using the standard import method. This way,we don’t need to create the objects
我不明白EXPORT_OK vs EXPORT有什么区别/用例。
大多数资源都提到了以下几点:

@Export allows to export the functions and variables of modules to
user’s namespace using the standard import method. This way,we don’t
need to create the objects for the modules to access it’s members.
@EXPORT_OK does export of symbols on demand basis for selective list
of symbols (subroutines and variables) of the module.

但我真的看不到这里的区别/含义。
有人可以提供这两个符号的区别/使用的一个小的基本例子吗?

解决方法

假设我有一个使用@EXPORT的包MyPackage。
#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导出到我的代码,而我不必说“给我这个”。 be_awesome不会导出(也不会使用@EXPORT_OK导出),我只是显示该部分,让您清楚“导出”给我们什么。

另一方面,如果我有一个使用@EXPORT_OK的MyOtherPackage包,

#this is MyOtherPackage.pm
package MyOtherPackage;
@EXPORT_OK = qw(do_awesome_thing);

sub do_awesome_thing { ... }

sub be_awesome { ... }

然后尝试

#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,它不会被导入,只能通过指定包名来访问。

要求导入do_awesome_thing的方式是在上面的mynewscript.pl的第二行使用MyOtherPackage qw(do_awesome_thing)。这表示导入该模块并使do_awesome_thing直接可用。之后,上面的mynewscript.pl第四行开始工作。

请注意,用户也可以使用第一个包中的MyPackage qw(do_awesome_thing),在这种情况下,@EXPORT列表中的其他任何内容都将不被导出,只有do_awesome_thing将被执行。所以,除了使用PackageName的默认情况; @EXPORT和@EXPORT_OK的行为类似。在默认情况下,@EXPORT中的任何内容都会自动抛入用户脚本中,而@EXPORT_OK更有礼貌,并且不会导出任何内容。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读