- サブルーチン foo をエクスポートし、このサブルーチンを持つモジュールをインポートします。最後に、perl スクリプトで呼び出します。
これを行うには、sub を実装するmodule/でExporterを使用します。およびpackage
を介してモジュールに何をエクスポートするかを伝えます。モジュールの場合、コンパイル時に現在の名前空間にインポートされます。以下のステートメントは同等です。@EXPORT_OK
@EXPORT
use
# This is the same...
use Module;
# ... as this
BEGIN {
require Module;
Module->import();
}
メイン スクリプトで使用するものがある場合、または頻繁に使用するものがある場合は、これを行います。いくつかの例はList::Util、Data::Dumperまたはuse feature 'say'
です。もちろん、他のモジュールでも使用できます。
use Data::Dumper;
use List::Util qw(max);
use feature qw(say);
my @foo = (1, 2, 3, 4, 5, 23);
print Dumper \@foo;
say max(@foo);
問題は、ここで名前空間を「汚染」することです。必要に応じてこれを行いますが、これはコンパイル時に行われるため、条件付きではないことに注意してください。あなたは言うことができません:
if ($foo) {
use Some::Module 'foo';
foo($foo);
} else {
use Something::Else 'bar';
bar();
}
Some::Module
と Something::Else
コンパイル時の両方でロードされるため、プログラムが消費する時間とメモリが増加します。条件はもちろん機能しますが、効率的ではありません。
- Perlスクリプトでそのモジュールのオブジェクトを作成し、最終的にそのオブジェクトを使用してfooを呼び出します。
これが OOp アプローチです。(前述のように)他の方法とは比較できません。オブジェクトのメソッドをインポートする必要はありません。use
または(上記参照) を使用してクラス (モジュール) をロードrequire
し、インスタンスを作成して、そのメソッドを好みに合わせて使用するだけです。ただし、そのためにはオブジェクト指向モジュールが必要です。それがどのように機能するかに興味がある場合は、まず perlootutを見てください。
- この myDir::Module::foo(); のように、そのパスを使用して foo を直接呼び出します。
実際にはそのパスではなく、その名前 (スペース) です。たとえば、Data::Dumper は、 dirのどこかにDumper.pm
あるフォルダーにあります。しかし、それはそれほど重要ではありません。Data
lib
最初のアプローチとの主な違いは、インポート部分を省略していることです。これは、特定のモジュールを条件付きでロードするものを構築したい場合、または巨大な (おそらくレガシー) アプリケーションを使用していて名前空間を汚染したくない場合に役立ちます。
if ($order_has_some_condition) {
require Very::Long::NameSpace::For::This::Condition::Module;
Very::Long::NameSpace::For::This::Condition::Module::do_stuff_with_an_order($order);
}
このコード片が 2,000 行のレガシー サブルーチンにあり、多くの処理が行われていると想像してください。この場合、そのほとんどは呼び出されません。use
この巨大なコード片で処理されるおそらく 100 の異なるケースのそれぞれでモジュールを使用できるようにするために、モジュールを使用したくありません。代わりに、本当に必要な場合にのみロードしたいと考えています。ここでrequire
モジュールを作成し、完全な名前を使用してそのサブを直接呼び出します。
結論として、最初の方法と 3 番目の方法の両方にメリットがあります。どちらも存在する必要があり、適切であれば両方を使用する必要があります。場合によっては単なる風味ですが、他の場合は決定するのが理にかなっています。2 番目の OOp アプローチは、まったく別のものです。
実際の速度の違いはなく、ボロディンが言ったように、Perl は高速です。もちろん、詰め込みをしなければimport
、輸入に「お金を払う」必要はありません。10 行のスクリプトでは、それは問題ではありません。1 つの巨大なファイルに数千行のコードと多くのユース ケースが含まれる可能性があるレガシー ソフトウェアでは、これは非常に重要です。
これがあなたの決定に役立つことを願っています。