10

perldocとからでも説明を読みましたStackOverflow。しかし、少し混乱があります。

  1. use通常はコンパイル時にモジュールをロードしますrequireが、実行時にはロードします
  2. use組み込みのインポート関数のみrequireを呼び出しますが、インポートモジュールを個別に呼び出す必要があります

    BEGIN {
        require ModuleName;
        ModuleName->import;
    }
    
  3. requireより大きなモジュールを時々ロードしたい場合に使用されます。

  4. userequire問題が発生したときに例外をスローするのに対し、以前の状態では例外をスローします
  5. useすべてではなく少数のプロシージャを選択的にロードできます

    use Module qw(foo bar) # it will load foo and bar only
    

でも可能requireですか?

さらに、 と の間に別の違いがuseありrequireますか?

Googleで多くの議論がありましたが、上記の点のみを理解しました。
他の点を教えてください。

4

3 に答える 3

8

myこれは、 、our、およびの違いのようなものlocalです。my違いは重要ですが、 99% の時間を使用する必要があります。

Perl はかなり古くて扱いにくい言語です。それは、awk/shell/kitchen sink 言語の組み合わせから、より強力な型付けとより強力な言語へと長年にわたって進化してきました。

モジュールパッケージの概念が固まる前の Perl 3.x の時代には、モジュールが関数と変数用の独自の名前空間を持つという概念はありませんでした。すべてがどこでも利用可能でした。インポートするものがありませんでした。useキーワードが存在しませんでした。いつも使っていrequireた .

Perl 5 が登場する頃には、モジュールには変数名とサブルーチン名のための独自のストレージがありました。したがって、私は私のプログラムで使用でき、$total私のFoo::Barモジュールも使用できました。$total$total$main::total$total$Foo::Bar::total

エクスポートは、モジュールの変数とサブルーチンをメイン プログラムで使用できるようにする方法でした。copy( $file, $tofile);そうすれば、の代わりに言うことができますFile::Copy::copy( $file, $tofile );

キーワードはuse単に自動化されたものです。さらに、プログラムが実行される前useコンパイル時に実行されました。これにより、モジュールはプロトタイピングfoo( @array )を使用できるようになるため、代わりにfoo( \@array )またはmunge $file;代わりに言うことができますmunge( $file );

use perldoc のページにあるように:

[使用] は次とまったく同じです。
BEGIN { require Module; Module->import( LIST ); }

基本的に、 99%use以上の時間を使用する必要があります。require

requireoverを使用する必要がある場合は 1 つだけ考えられますがuse、それはエミュレートするためだけuseです。モジュールがオプションの場合があります。利用できる場合Foo::Barは使用できますが、利用できない場合は使用しません。利用可能かどうかを確認できれば幸いFoo::Barです。

これを試してみましょう:

eval { use Foo::Bar; };
  my $foo_bar_is_available = 1 unless ($@);

が利用できない場合Foo::Barは、次のようになります。

Can't locate Foo/Bar.pm in @INC (@INC contains:....)

これuseは、eval を実行する前に発生するためです。useただし、次の方法でエミュレートする方法を知っていrequireます。

BEGIN {
    eval { require Foo::Bar; Foo::Bar->import( qw(foo bar barfu) ); };
    our foo_bar_module_available = 1 unless ($@);
}

これは機能します。コードでこれを確認できるようになりました。

our $foo_bar_module_available;
if ( $foo_bar_module_available ) {
    fubar( $var, $var2 );   #I can use it
}
else {
    ...                     #Do something else
}
于 2013-08-14T15:13:50.277 に答える
6

2番目のポイントで自分で書いたコードは、2つの違いを自明だと思います...

実際には、「使用」はモジュールの「要求」を実行し、その後モジュールを自動的にインポートします。代わりに「要求」を使用すると、モジュールは存在することが必須ですが、必要なときに自由にインポートできます...

上記のことを考えると、ポイント 5 の質問が意味をなさないことは明らかです。「require」は何もインポートしないため、ロードするモジュール部分を指定する必要はありません。インポート操作を行います...

さらに、「使用」はコンパイル時 (Perl コンパイル フェーズ)に作用し、「要求」は実行時に作用することに注意してください。必要です。

于 2013-08-14T12:23:48.523 に答える