1

我想检测我的 perl 代码中的语法错误。我发现perlcritic错过了很多,(例如,else在 any 之前随机插入if,所以尝试编译perl -cw看起来是唯一可行的选择。

但是,我不想在检查错误时打开自己执行代码。

这篇 perlmonks 帖子 显示 in BEGININITUNITCHECKCHECK块可以/确实在编译时执行。

我可以perl在不运行任何代码的情况下检查代码吗?

删除或重命名可能导致执行的块怎么办?

4

1 回答 1

2

既不perlcritic也不perltidy执行他们分析/操作的任何代码。


要正确解析 Perl 代码,需要执行其中的一部分。

例如,

BEGIN {
   if (rand() < 0.5) {
      *f = sub { 5 };
   } else {
      *f = sub() { 5 };
   }
}

print f + 2;

随机输出57因为最后一条语句被随机编译为以下之一:

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语句)等。
于 2020-09-04T13:20:11.463 回答