Załóżmy, że mam pakiet MyPackage
, który używa @EXPORT
.
#this is MyPackage.pm
package MyPackage;
@EXPORT = qw(do_awesome_thing);
sub do_awesome_thing { ... }
sub be_awesome { ... }
Teraz, gdy używam MyPackage
w moim kodu,
#this is myscript.pl
use MyPackage;
do_awesome_thing(); #works
be_awesome(); #doesn't work
MyPackage::be_awesome(); #works
do_awesome_thing
zostanie automatycznie eksportowane do mojego kodu z MyPackage
, bez konieczności mi powiedzieć "daj mi to". be_awesome
nie jest eksportowany (i nie będzie eksportowany z @EXPORT_OK
, po prostu pokazuję tę część, aby wyjaśnić, co daje nam "eksportowanie").
Z drugiej strony, jeśli mam pakiet MyOtherPackage
który używa @EXPORT_OK
,
#this is MyOtherPackage.pm
package MyOtherPackage;
@EXPORT_OK = qw(do_awesome_thing);
sub do_awesome_thing { ... }
sub be_awesome { ... }
a następnie spróbuj
#this is mynewscript.pl
use MyOtherPackage;
do_awesome_thing(); #doesn't work
MyOtherPackage::do_awesome_thing(); #works, as always
linia nazywając do_awesome_thing
bezpośrednio nie będzie działać. Dzieje się tak dlatego, że umieszczenie czegoś w @EXPORT_OK
mówi "przekaż to moim użytkownikom tylko wtedy, gdy o to poprosią". Odkąd właśnie powiedzieliśmy, że use MyOtherPackage
nie wymaga jawnego importowania tutaj do_awesome_thing
, nie jest on importowany i jest dostępny tylko po podaniu nazwy pakietu.
Sposób, w jaki należy poprosić o zaimportowanie do_awesome_thing
, to use MyOtherPackage qw(do_awesome_thing)
w drugiej linii mynewscript.pl
powyżej. Oznacza to, że należy zaimportować ten moduł i udostępnić do_awesome_thing
bezpośrednio. Następnie czwarta linia w powyższej mynewscript.pl
zacznie działać.
Należy pamiętać, że użytkownik może określić use MyPackage qw(do_awesome_thing)
również z pierwszym pakietem. W takim przypadku wszystkie elementy listy @EXPORT
nie zostaną wyeksportowane, a jedynie do_awesome_thing
. Tak więc, z wyjątkiem domyślnego przypadku use PackageName;
, @EXPORT
i @EXPORT_OK
zachowują się podobnie. W domyślnym przypadku cokolwiek w @EXPORT
zostaje automatycznie wrzucone do skryptu użytkownika, podczas gdy @EXPORT_OK
jest bardziej uprzejme i nie eksportuje niczego.
Nie należy eksportować wielu symboli domyślnie, jeśli w ogóle. @EXPORT będzie zazwyczaj mały lub pusty. @EXPORT_OK może zawierać znacznie więcej. Na przykład kodowanie eksportuje domyślnie 'kodowanie' i' dekodowanie '('@ EXPORT'), ale nie' is_utf8' ('@ EXPORT_OK') – ikegami