web-dev-qa-db-ja.com

perlのexport vs export_ok

EXPORT_OKEXPORTの違い/使用例を理解できません。
ほとんどのリソースは次の行で何かについて言及しています:

@Exportでは、標準のインポート方法を使用して、モジュールの関数と変数をユーザーの名前空間にエクスポートできます。これにより、モジュールがメンバーにアクセスするためのオブジェクトを作成する必要がなくなります。
@ EXPORT_OKは、モジュールのシンボル(サブルーチンと変数)の選択リストのオンデマンドベースでシンボルをエクスポートします。

しかし、私は本当に違い/意味をここに見ません。
これら2つの記号の違い/使い方の基本的な例を誰か教えてください。

27
Jim

_@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_はより丁寧で何もエクスポートしません。

39
sundar