use EXPORT和use EXPORT_OK

本文详细解释了Perl中模块导出机制的两个关键方面:@EXPORT和@EXPORT_OK。通过具体的示例展示了如何使用这两个特性来控制模块成员的可见性和导出行为。@EXPORT会自动将指定的符号导出到使用该模块的脚本,而@EXPORT_OK则更为灵活,只在用户明确请求时才导出符号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我不明白 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 会更加的礼貌不会导出任何东西






















转载于:https://www.cnblogs.com/zhaoyangjian724/p/6200016.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值