use IO::Uncompress::Gunzip qw( gunzip $GunzipError );
の略です
BEGIN {
require IO::Uncompress::Gunzip;
import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
}
BEGINブロックはコンパイルされるとすぐに評価されます。つまり、コードは次のことを行います。
- コンパイル段階:
evalステートメントを
コンパイルします。
- コンパイルされ
BEGINたブロック。
- コンパイル
require IO::Uncompress::Gunzip;
- コンパイル
import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
- ブロックを評価
BEGINします。
- 評価
require IO::Uncompress::Gunzip;
- 評価
import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
ifステートメントをコンパイルします。
- 実行フェーズ:
- (空)
evalステートメントを評価します。
ifステートメントを評価します。
ステップ 1.1.2.1 で例外が発生した場合、evalステップ 2.1 の実行ではキャッチされません。
ソリューション:
あなたは同等のものから始めました
BEGIN {
require IO::Uncompress::Gunzip;
import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
}
requireキャッチしたいのはエラーなので、のeval周りにを追加するだけrequireです:
BEGIN {
eval { require IO::Uncompress::Gunzip }
or die "Error: IO::Uncompress::Gunzip not installed: $@";
import IO::Uncompress::Gunzip qw( gunzip $GunzipError );
}
代わりに をuse使用して、コンパイル (および評価) を遅らせることもできます。eval EXPReval BLOCK
BEGIN {
eval 'use IO::Uncompress::Gunzip qw( gunzip $GunzipError ); 1'
or die "Error: IO::Uncompress::Gunzip not installed: $@";
}
(モジュールがインストールされているかどうかを調べる良い方法があればいいのにと思います。最初の解決策でさえ他のエラーをキャッチしますが、2番目の解決策はさらに多くのエラーをキャッチします。)