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
}