如果模块存在,我如何编写可选择使用模块的代码



如果我想编写可以选择使用模块的代码,我该怎么做?例如,如果我想写warn转储对象的代码,如果Data::Dumper可用,或者只有warn可用,我该怎么做?

BEGIN {
if (eval { require Data::Dumper }) {
*dumper = sub { warn(Data::Dumper::Dumper(@_)) };
} else {
*dumper = sub { };
}
}
dumper(...);

以上的缺点是,如果Data::Dumper不可用,则仍需要计算作为参数传递的昂贵表达式。

use constant has_dumper => eval { require Data::Dumper };
BEGIN {
if (has_dump) {
*dumper = sub { warn(Data::Dumper::Dumper(@_)) };
} else {
*dumper = sub { };
}
}
dumper(...);                # Ok
dumper(...) if has_dumper;  # Statement completely optimized away if DD missing.

这是加载可选模块的有效习惯用法

use constant has_Module => defined eval { require Module };

这将需要模块(如果可用(,并将状态存储在常量中。

你可以像一样使用这个

use constant has_DataDumper => defined eval { require Data::Dumper };
warn "got object";
if ( has_DataDumper ) {
warn Data::Dumper::Dumper( $obj );
}

最新更新