30

EXPORT_OKvsの違い/ユースケースが何であるか理解できませんEXPORT
ほとんどのリソースでは、次の行に何かが言及されています。

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

しかし、ここでは違い/意味がわかりません。
誰かがこれら2つのシンボルの違い/使用法の小さな基本的な例を提供できますか?

4

2 に答える 2

17

細かいエクスポーターのマニュアルから:

  • use YourModule;
    これにより、YourModule のすべてのシンボルがuse@EXPORTステートメントの名前空間にインポートされます。
  • use YourModule ();
    これにより、perl はモジュールをロードしますが、シンボルをインポートしません。
  • use YourModule qw(...);
    これにより、呼び出し元によってリストされたシンボルのみが名前空間にインポートされます。リストされているすべての記号は、@EXPORTまたは@EXPORT_OKに含まれている必要があります。そうでない場合、エラーが発生します。Exporter の高度なエクスポート機能はこのようにアクセスされますが、シンボル名とは構文的に異なるリスト エントリを使用します。

したがって、あなたが を使用@EXPORTし、誰かが通常use YourModule;の を実行した場合、名前空間が のすべてで汚染されたことになります@EXPORT。ただし、を使用する場合は@EXPORT_OK、モジュールを使用する人が自分の名前空間に何が起こるかを制御できるように、インポートするものを具体的に要求する必要があります。

違いは、user の名前空間に入る内容を誰が制御するかという問題です。使用する場合は d@EXPORTであるモジュールが行い、使用する場合は、インポートを行うコードが独自の名前空間を制御します。use@EXPORT_OK

もちろん、use Whatever();失礼なモジュールが名前空間を汚染しないようにすることはいつでもできますが、それは醜いので、名前空間全体に走り書きしたい失礼なコードをこじ開ける必要はありません。

于 2013-07-28T20:26:51.133 に答える