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
require
overを使用する必要がある場合は 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
}