die函数与use函数一起使用时会产生语法错误

时间:2019-06-27 20:12:39

标签: perl error-handling syntax-error

我正在尝试在Perl中创建一个备份系统。最终,我想与世界分享。但是我想确保人们安装了正确的模块,因此我想进行一些异常处理以防他们没有正确的模块。具有讽刺意味的是,当在以下情况下使用die函数时,die函数会产生语法错误:

use strict; use warnings;

use Tk or die "You don't have the Tk module installed."

如何调整以获得所需的效果?

1 个答案:

答案 0 :(得分:8)

use语句很特殊,它不能像函数调用那样工作。它与大多数语句不同,它在编译时执行,并使用唯一的语法分析语句的其余部分-即模块名称必须是裸字,其后可以是可选的模块版本,后跟参数列表。

如果未找到Tk,use Tk;就已经引发了异常,您不需要自己进行任何检查。如果您想自定义错误消息,则可以使用require将其加载到运行时语句中并捕获异常,但是您实际上应该包括@INC的内容或包含该内容的原始错误消息,用于调试应在何处找到模块:

use strict;
use warnings;
BEGIN {
  unless (eval { require Tk; Tk->import; 1 }) {
    die "You don't have the Tk module installed: $@";
  }
}

CPAN分发的依赖关系在元数据中指定,并由该分发的配置脚本指定,这可以确保在用户尝试使用CPAN客户端安装分发时安装它们。参见http://blogs.perl.org/users/neilb/2017/05/specifying-dependencies-for-your-cpan-distribution.html。对于在CPAN之外分发的代码,cpanfile提供了一种用于指定依赖关系的格式,可以由用户使用cpanm轻松安装。