1

次のようなモジュール ファイルが 2 つあるとします。

package myPackage;
use Bio::Seq;

そして、次のような別のファイル:

use lib "path/to/lib";
use myPackage;
use Bio::Seq;

Bio::Seq が 2 回含まれないようにするにはどうすればよいですか? ありがとう

4

5 に答える 5

3

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 ();
于 2013-03-07T18:18:58.727 に答える
3

重複して含まれることはありません。useセマンティクスは次のように記述できます。

  1. requireモジュール
  2. モジュールの呼び出しimport

ドキュメントが言うように、それは以下と同等です:

BEGIN { require Module; Module−>import( LIST ); }

require一方、メカニズムは、モジュールのコードが一度だけコンパイルおよび実行されることを保証します。このメカニズムは、特殊変数 に基づいています%INC。詳細については、、、および perlmod ページのドキュメントを参照useてください。require

于 2013-03-07T18:16:19.333 に答える
3

モジュールは、C のように Perl に「含まれる」わけではありません。モジュールは「ロード」されます。つまり、「実行」されます。

モジュールは、useそれを指定するステートメントの数に関係なく、一度だけロード/実行されます。

モジュールごとuseに発生する唯一のことは、モジュールのimportメソッドへの呼び出しです。これは通常、シンボルを using 名前空間にエクスポートするために使用されます。

于 2013-03-07T18:06:00.837 に答える
1

Moduleのロード(使用)を最適化したいのでしょう。

最適化には、動的読み込みが役立つ場合があります。

Perl モジュールを動的にロードするには、Class::Autouseを使用します。

詳細については、このリンクにアクセスしてください。

于 2013-03-07T18:14:48.343 に答える