大多数资源都提到了以下几点:
@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.
但我真的看不到这里的区别/含义。
有人可以提供这两个符号的区别/使用的一个小的基本例子吗?
解决方法
#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更有礼貌,并且不会导出任何内容。