可能重复:
How can I check if I have a Perl module before using it?
我想评估一个与此类似的用法语句:eval {use $ foo;}但是我遇到了正确的语法问题。我尝试了各种字符串插值组合,但即使对于不存在的模块,eval也会成功。有人可以帮我把这个吗?
答案 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 }
甚至编译,因为它会导致语法错误,因此脚本永远不会运行。我不确定你的意思是“永远成功”,除非你的意思相反:“总是失败”。