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