我正在尝试在Perl中创建一个备份系统。最终,我想与世界分享。但是我想确保人们安装了正确的模块,因此我想进行一些异常处理以防他们没有正确的模块。具有讽刺意味的是,当在以下情况下使用die函数时,die函数会产生语法错误:
use strict; use warnings;
use Tk or die "You don't have the Tk module installed."
如何调整以获得所需的效果?
答案 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轻松安装。