次のようなモジュール ファイルが 2 つあるとします。
package myPackage;
use Bio::Seq;
そして、次のような別のファイル:
use lib "path/to/lib";
use myPackage;
use Bio::Seq;
Bio::Seq が 2 回含まれないようにするにはどうすればよいですか? ありがとう
use Foo
ほとんど同等です
# perldoc -f use
BEGIN {
require "Foo.pm";
Foo->import();
}
そしてrequire "Foo"
、ほとんど同等です
# perldoc -f require
sub require {
my ($filename) = @_;
if (exists $INC{$filename}) {
return 1 if $INC{$filename};
die "Compilation failed in require";
}
# .... find $filename in @INC
# really load
return do $realfilename;
}
そう
いいえ、コードは複数回「ロード」されることはなく、複数回「インポート」されるだけです。
次のようなコードがある場合
package Bio::Seq;
...
sub import {
# fancy stuff
}
そして、ライブラリがロードされていることを確認したいが、それを呼び出したくないimport
、
#perldoc -f use
use Bio::Seq ();
重複して含まれることはありません。use
セマンティクスは次のように記述できます。
require
モジュールimport
ドキュメントが言うように、それは以下と同等です:
BEGIN { require Module; Module−>import( LIST ); }
require
一方、メカニズムは、モジュールのコードが一度だけコンパイルおよび実行されることを保証します。このメカニズムは、特殊変数 に基づいています%INC
。詳細については、、、および perlmod ページのドキュメントを参照しuse
てください。require
モジュールは、C のように Perl に「含まれる」わけではありません。モジュールは「ロード」されます。つまり、「実行」されます。
モジュールは、use
それを指定するステートメントの数に関係なく、一度だけロード/実行されます。
モジュールごとuse
に発生する唯一のことは、モジュールのimport
メソッドへの呼び出しです。これは通常、シンボルを using 名前空間にエクスポートするために使用されます。
Moduleのロード(使用)を最適化したいのでしょう。
最適化には、動的読み込みが役立つ場合があります。
Perl モジュールを動的にロードするには、Class::Autouseを使用します。
詳細については、このリンクにアクセスしてください。