EXPORT_OK
とEXPORT
の違い/使用例を理解できません。
ほとんどのリソースは次の行で何かについて言及しています:
@Exportでは、標準のインポート方法を使用して、モジュールの関数と変数をユーザーの名前空間にエクスポートできます。これにより、モジュールがメンバーにアクセスするためのオブジェクトを作成する必要がなくなります。
@ EXPORT_OKは、モジュールのシンボル(サブルーチンと変数)の選択リストのオンデマンドベースでシンボルをエクスポートします。
しかし、私は本当に違い/意味をここに見ません。
これら2つの記号の違い/使い方の基本的な例を誰か教えてください。
_@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 { ... }
_
してみてください
_#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
_のインポートを要求する方法は、上記の_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
_はより丁寧で何もエクスポートしません。