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 EXPR
eval BLOCK
BEGIN {
eval 'use IO::Uncompress::Gunzip qw( gunzip $GunzipError ); 1'
or die "Error: IO::Uncompress::Gunzip not installed: $@";
}
(モジュールがインストールされているかどうかを調べる良い方法があればいいのにと思います。最初の解決策でさえ他のエラーをキャッチしますが、2番目の解決策はさらに多くのエラーをキャッチします。)