我想检测我的 perl 代码中的语法错误。我发现perlcritic
错过了很多,(例如,else
在 any 之前随机插入if
,所以尝试编译perl -cw
看起来是唯一可行的选择。
但是,我不想在检查错误时打开自己执行代码。
这篇 perlmonks 帖子 显示 in BEGIN
、INIT
、UNITCHECK
和
CHECK
块可以/确实在编译时执行。
我可以perl
在不运行任何代码的情况下检查代码吗?
删除或重命名可能导致执行的块怎么办?
我想检测我的 perl 代码中的语法错误。我发现perlcritic
错过了很多,(例如,else
在 any 之前随机插入if
,所以尝试编译perl -cw
看起来是唯一可行的选择。
但是,我不想在检查错误时打开自己执行代码。
这篇 perlmonks 帖子 显示 in BEGIN
、INIT
、UNITCHECK
和
CHECK
块可以/确实在编译时执行。
我可以perl
在不运行任何代码的情况下检查代码吗?
删除或重命名可能导致执行的块怎么办?
既不perlcritic
也不perltidy
执行他们分析/操作的任何代码。
要正确解析 Perl 代码,需要执行其中的一部分。
例如,
BEGIN {
if (rand() < 0.5) {
*f = sub { 5 };
} else {
*f = sub() { 5 };
}
}
print f + 2;
随机输出5
或7
因为最后一条语句被随机编译为以下之一:
print( f( +2 ) ); # rand() >= 0.5
print( f() + 2 ); # rand() < 0.5
好的,所以这很牵强。或者是吗?和这有什么区别
use Module qw( f ); # No different than a BEGIN block.
print f + 2;
好的,所以不鼓励使用原型。但是关于
say "foo"; # This is a sub call.
use feature qw( say );
say "foo"; # This isn't a sub call; this is the say operator.
这意味着正确解析使用say
运算符(不计算CORE::say
)的代码需要执行代码。很多代码使用say
运算符。
但是,如果您考虑一些常见的特殊情况,并且如果您接受一定程度的不精确性(例如say
是子调用还是say
运算符),则可以相当准确地解析 Perl 代码而无需执行任何代码。这就是PPI背后的理念。
perlcritic
使用 PPI。它不执行它分析的任何代码。perltidy
使用自己的解析器。它不执行它分析的任何代码。perl -c
将执行BEGIN
块(包括use
语句)等。