Giả sử tôi có gói MyPackage
sử dụng @EXPORT
.
#this is MyPackage.pm
package MyPackage;
@EXPORT = qw(do_awesome_thing);
sub do_awesome_thing { ... }
sub be_awesome { ... }
Bây giờ, khi tôi sử dụng MyPackage
trong mã của tôi,
#this is myscript.pl
use MyPackage;
do_awesome_thing(); #works
be_awesome(); #doesn't work
MyPackage::be_awesome(); #works
do_awesome_thing
được tự động xuất khẩu sang mã của tôi từ MyPackage
, mà không có tôi phải nói "đưa cái này cho tôi". be_awesome
không được xuất khẩu (và nó sẽ không được xuất khẩu với @EXPORT_OK
hoặc là, tôi chỉ hiển thị phần đó để giúp bạn rõ ràng về những gì "xuất khẩu" cung cấp cho chúng tôi).
Mặt khác, nếu tôi có một gói MyOtherPackage
sử dụng @EXPORT_OK
,
#this is MyOtherPackage.pm
package MyOtherPackage;
@EXPORT_OK = qw(do_awesome_thing);
sub do_awesome_thing { ... }
sub be_awesome { ... }
và sau đó thử
#this is mynewscript.pl
use MyOtherPackage;
do_awesome_thing(); #doesn't work
MyOtherPackage::do_awesome_thing(); #works, as always
dòng gọi do_awesome_thing
trực tiếp sẽ không hoạt động. Điều này là do việc đặt nội dung nào đó vào số @EXPORT_OK
cho biết "chỉ cung cấp cho người dùng của tôi nếu họ yêu cầu". Vì chúng tôi vừa nói use MyOtherPackage
mà không yêu cầu một cách rõ ràng cho do_awesome_thing
để được nhập ở đây, nó không được nhập và chỉ có thể truy cập bằng cách chỉ định tên gói.
Cách bạn yêu cầu nhập do_awesome_thing
để nói use MyOtherPackage qw(do_awesome_thing)
ở dòng thứ hai là mynewscript.pl
ở trên. Điều này cho biết nhập mô-đun đó và thực hiện trực tiếp do_awesome_thing
. Sau đó, dòng thứ tư trong số mynewscript.pl
ở trên sẽ bắt đầu hoạt động.
Lưu ý rằng người dùng có thể chỉ định use MyPackage qw(do_awesome_thing)
với gói đầu tiên và trong trường hợp đó, bất kỳ điều gì khác trong danh sách @EXPORT
sẽ không được xuất, chỉ do_awesome_thing
sẽ là. Vì vậy, ngoại trừ trường hợp mặc định là use PackageName;
, @EXPORT
và @EXPORT_OK
hoạt động tương tự. Trong trường hợp mặc định, mọi thứ trong @EXPORT
được tự động nhập vào tập lệnh của người dùng, trong khi @EXPORT_OK
lịch sự hơn và không xuất bất kỳ thứ gì.
Bạn không nên xuất nhiều biểu tượng theo mặc định nếu có. @EXPORT thường sẽ nhỏ hoặc trống. @EXPORT_OK có thể bao gồm nhiều hơn nữa. Ví dụ: Mã hóa xuất 'mã hóa' và' giải mã' theo mặc định ('@ EXPORT'), nhưng không phải' is_utf8' ('@ EXPORT_OK') – ikegami