尝试使用eval检查perl模块

时间:2012-02-07 15:34:38

标签: perl eval

  

可能重复:
  How can I check if I have a Perl module before using it?

我想评估一个与此类似的用法语句:eval {use $ foo;}但是我遇到了正确的语法问题。我尝试了各种字符串插值组合,但即使对于不存在的模块,eval也会成功。有人可以帮我把这个吗?

2 个答案:

答案 0 :(得分:5)

您正在寻找的习语是:

eval "use $module; 1" or ... ;

eval "use $module; 1" or warn "$module is not available: $@";
eval "use $module; 1" or die "This script requires $module";
eval "use $module; 1" or $module_available = 0;

eval“总是成功”,因为无论评估什么代码,程序执行都会继续 - 这实际上是eval语句的重点。如果计算的字符串包含错误 - 运行时或编译时 - eval调用的返回值为undef,并且将使用适当的错误消息设置特殊变量$@

即使成功,use语句也不会返回值。这就是为什么这个成语最后包含“; 1”。

答案 1 :(得分:0)

use是在编译期间处理的关键字,如注释中所述,它确实要求您使用裸字参数。也就是说,没有变数。

现在,我无法获得eval { use $foo }甚至编译,因为它会导致语法错误,因此脚本永远不会运行。我不确定你的意思是“永远成功”,除非你的意思相反:“总是失败”。