Diciamo che ho un pacchetto MyPackage
che utilizza @EXPORT
.
#this is MyPackage.pm
package MyPackage;
@EXPORT = qw(do_awesome_thing);
sub do_awesome_thing { ... }
sub be_awesome { ... }
Ora, quando uso MyPackage
nel mio codice,
#this is myscript.pl
use MyPackage;
do_awesome_thing(); #works
be_awesome(); #doesn't work
MyPackage::be_awesome(); #works
do_awesome_thing
ottiene esportati automaticamente al mio codice da MyPackage
, senza di me dover dire "dare a questo a me". be_awesome
non viene esportato (e non verrà esportato con @EXPORT_OK
, sto solo mostrando quella parte per chiarire cosa ci "esporta").
D'altra parte, se ho un pacchetto MyOtherPackage
che utilizza @EXPORT_OK
,
#this is MyOtherPackage.pm
package MyOtherPackage;
@EXPORT_OK = qw(do_awesome_thing);
sub do_awesome_thing { ... }
sub be_awesome { ... }
e quindi provare
#this is mynewscript.pl
use MyOtherPackage;
do_awesome_thing(); #doesn't work
MyOtherPackage::do_awesome_thing(); #works, as always
la linea chiamando direttamente do_awesome_thing
non funzionerà. Questo perché mettere qualcosa in @EXPORT_OK
dice "dai ai miei utenti solo se lo chiedono". Poiché abbiamo appena detto use MyOtherPackage
senza chiedere esplicitamente che do_awesome_thing
venga importato qui, non viene importato ed è accessibile solo specificando il nome del pacchetto.
Il modo in cui si richiede do_awesome_thing
da importare è use MyOtherPackage qw(do_awesome_thing)
nella seconda riga di mynewscript.pl
precedente. Questo dice importare quel modulo e rendere disponibile do_awesome_thing
direttamente. Dopodiché, la quarta riga in mynewscript.pl
inizierà a funzionare.
Si noti che l'utente può specificare anche use MyPackage qw(do_awesome_thing)
con il primo pacchetto, e in tal caso, qualsiasi altro contenuto nell'elenco @EXPORT
non verrà esportato, sarà solo do_awesome_thing
. Pertanto, ad eccezione del caso predefinito use PackageName;
, @EXPORT
e @EXPORT_OK
si comportano in modo simile. Nel caso predefinito, qualsiasi elemento di @EXPORT
viene automaticamente inserito nello script dell'utente, mentre @EXPORT_OK
è più educato e non esporta nulla.
Non è consigliabile esportare molti simboli per impostazione predefinita, se del caso. @EXPORT sarà in genere piccolo o vuoto. @EXPORT_OK può includere molto di più. Ad esempio, Encode esporta 'encode' e' decode' di default ('@ EXPORT'), ma non' is_utf8' ('@ EXPORT_OK') – ikegami