如何解决阻止编译器执行BEGIN / UNITCHECK / CHECK / INIT块
我想在我的perl代码中检测语法错误。我发现perlcritic
错过了许多(例如,在任何else
之前插入了随机的if
,因此尝试使用perl -cw
进行编译似乎是唯一可行的选择。
但是,我不想在检查错误时开放自己来执行代码。
This perlmonks post在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
语句)等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。