たとえば、@EXPORT
を使用するMyPackage
というパッケージがあります。今
#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 { ... }
して、直接do_awesome_thing
を呼び出す行は動作しません
#this is mynewscript.pl
use MyOtherPackage;
do_awesome_thing(); #doesn't work
MyOtherPackage::do_awesome_thing(); #works, as always
してみてください。これは、@EXPORT_OK
の中に何かを入れると、「要求した場合にのみこれを私のユーザに与えてください」と書かれているからです。ここではdo_awesome_thing
を明示的にインポートせずにuse MyOtherPackage
と言っただけなので、インポートされず、パッケージ名を指定することによってのみアクセスできます。
do_awesome_thing
をインポートする方法は、上記のmynewscript.pl
の2行目のuse MyOtherPackage qw(do_awesome_thing)
となります。これはそのモジュールをインポートし、do_awesome_thing
を直接利用できるようにします。その後、上記のmynewscript.pl
の4行目が機能し始めます。
use MyPackage qw(do_awesome_thing)
も最初のパッケージで指定できます。この場合、@EXPORT
リストの他のものはエクスポートされません。do_awesome_thing
のみになります。したがって、デフォルトのケースであるuse PackageName;
を除いて、@EXPORT
と@EXPORT_OK
は同様に動作します。デフォルトの場合、@EXPORT
の内容は自動的にユーザーのスクリプトにスローされますが、@EXPORT_OK
はより丁寧で何かをエクスポートしません。
シンボルがあれば、デフォルトで多くのシンボルをエクスポートするべきではありません。 @EXPORTは通常小さいか空です。 @EXPORT_OKにははるかに多く含めることができます。例えば、Encodeは、デフォルトで( '@EXPORT')の' encode'と '' decode'をエクスポートしますが、 '' is_utf8''( '@EXPORT_OK')はエクスポートしません。 – ikegami