2012-10-16 59 views
41

我在我的Bash脚本中调用了许多Perl脚本(有时也来自csh)。如何检查Perl脚本是否没有编译错误?

在Bash脚本的开始部分,我想放一个测试,检查所有的Perl脚本是否没有任何编译错误。

这样做的一种方法是实际调用Bash脚本中的Perl脚本和grep以获得管道日志文件中的“编译错误”,但这会变得混乱,因为在代码中的不同点上调用不同的Perl脚本,所以我想在Bash脚本的开头就这样做。

有没有办法检查Perl脚本是否没有编译错误?

回答

59

当心!!

使用下面的命令检查Perl程序中的编译错误可能是危险的。

$ perl -c yourperlprogram 

兰德尔写关于这个主题非常好文章,你应该看看

从他的文章引用:

也许si我们可以说最简单的事情是“它有效吗?”。对于这一点,我们 调用Perl本身,通过唯一的编译开关:

perl -c ourprogram 

对于此操作,perl的编译程序, 但停止只是短暂的执行阶段。这意味着程序文本的每个 部分都被翻译成代表工作程序的内部数据结构 ,但我们并没有实际执行 任何代码。如果有任何语法错误,我们会通知您,编译将中止。

其实,这是一个谎言。由于BEGIN块(包括 它们的分层表示,使用指令),在理论上安全的“语法检查”期间,某些Perl代码可能会执行 。对于 例如,如果你的代码包含:

BEGIN { warn "Hello, world!\n" } 

然后你会看到,即使是在Perl的-c 该消息!这对于那些认为“仅编译”意味着“不执行代码”的人来说有些令人惊讶。考虑 代码包含:

BEGIN { system "rm", "-rf", "/" } 

,你会看到的问题 这样的说法。哎呀。

+0

感谢您了解该方法的局限性。顺便说一句,我应该如何管perl -c输出? 'perl -c script.pl | grep“语法OK”'不能按预期工作。我希望它在包含编译错误时不会返回任何内容。 – user13107

+1

没关系,明白了! 'perl -c script.pl |&grep“语法OK”' – user13107

+0

最好检查一下实际的退出值,而不是grep的某些字符串输出。如果成功,退出值将为0,如果失败,则退出值为非零。 –

-1

当你需要检查错误/运行前警告,但你的文件依赖您可以添加多个其他文件选项-I

perl -I /path/to/dependency/lib -c /path/to/file/to/check 

编辑:从人perlrun通过-I指定

目录前加上用于模块(@INC)的搜索路径。