Ответ 1
Скажем, у меня есть пакет 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
, без необходимости говорить "дайте мне это". be_awesome
не экспортируется (и он не будет экспортироваться с помощью @EXPORT_OK
), я просто покажу эту часть, чтобы вы поняли, что дает нам "экспорт" ).
С другой стороны, если у меня есть пакет MyOtherPackage
, который использует @EXPORT_OK
,
#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
, который вы хотите импортировать, состоит в том, чтобы сказать use MyOtherPackage qw(do_awesome_thing)
во второй строке mynewscript.pl
выше. Это говорит о том, что импортировать этот модуль и сделать do_awesome_thing
доступным напрямую. После этого начнет работать четвертая строка в mynewscript.pl
выше.
Обратите внимание, что пользователь может также указать use MyPackage qw(do_awesome_thing)
с первым пакетом, и в этом случае ничего другого в списке @EXPORT
не будет экспортировано, будет только do_awesome_thing
. Таким образом, за исключением случая по умолчанию use PackageName;
, @EXPORT
и @EXPORT_OK
ведут себя аналогичным образом. В случае по умолчанию все в @EXPORT
автоматически загружается в пользователя script, а @EXPORT_OK
более вежлив и ничего не экспортирует.