假设我有一个使用 @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 中添加一些内容表示“仅在我的用户要求时才将其提供给我的用户”。由于我们刚刚说use MyOtherPackage 没有明确要求在此处导入do_awesome_thing,因此它不会被导入,并且只能通过指定包名来访问。
您要求导入do_awesome_thing 的方式是在上面mynewscript.pl 的第二行中说use MyOtherPackage qw(do_awesome_thing)。这表示导入该模块并使do_awesome_thing 直接可用。之后,上面mynewscript.pl 中的第四行将开始工作。
请注意,用户也可以在第一个包中指定use MyPackage qw(do_awesome_thing),在这种情况下,不会导出@EXPORT 列表中的任何其他内容,只会导出do_awesome_thing。因此,除了use PackageName; 的默认情况外,@EXPORT 和@EXPORT_OK 的行为相似。在默认情况下,@EXPORT 中的任何内容都会自动放入用户的脚本中,而@EXPORT_OK 则更有礼貌,不会导出任何内容。