如果模块存在,我如何编写可选地使用模块的代码?
How can I write code that optionally uses a module if it exists?
如果我想编写可选地使用模块的代码,我该怎么做?例如,如果我想编写 warn
s 如果 Data::Dumper
可用或仅 warn
s 转储对象的代码,我该怎么做?
这是加载可选模块的有效习惯用法,
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 );
}
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.
如果我想编写可选地使用模块的代码,我该怎么做?例如,如果我想编写 warn
s 如果 Data::Dumper
可用或仅 warn
s 转储对象的代码,我该怎么做?
这是加载可选模块的有效习惯用法,
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 );
}
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.