如何在Perl条件中检测无法访问的代码,总是求值为false?

前端之家收集整理的这篇文章主要介绍了如何在Perl条件中检测无法访问的代码,总是求值为false?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我是Perl的新手,目前我的任务是整理和维护一个庞大且相当混乱的Perl项目.我正在使用perl-critic来帮助我检测代码中的问题(并教我最佳实践).

现有代码具有编码器创建无法访问代码的位置.例如,他们添加了’&& 0’作为评论一些代码分支的懒惰方式:

if ($req->param('donut') && 0) {
    unreachable code... 
} else {
    always branches to here...
}

我希望perl或者Critic会在这种情况下警告我关于无法访问的代码(其中条件有一个常量值评估为false),但事实并非如此.

是否有可以使用的工具或脚本可以可靠地检测出这种东西?

显然我可以搜索’&&源代码中的0’但是编码器可以通过多种方式创建无法访问的代码,除了附加’&& 0’到if语句.

解决方法

使用 B::Deparse,您可以在某些情况下检测无法访问的代码
perl -MO=Deparse -e 'if (0 && $x) {print 1} else {print 2}'
do {
    print 2
};
-e Syntax OK

如果0不是第一个条件,那就不容易了:

perl -MO=Deparse -e 'if ($x && 0) {print 1} else {print 2}'
if ($x and 0) {
    print 1;
}
else {
    print 2;
}
-e Syntax OK

为什么会有所不同?好吧,如果0到最后,必须检查它之前的所有条件.它们可能会产生副作用,但仍会发生.此外,&&强制标量上下文,因此它可以在评估条件时更改调用代码的行为.

这并没有解释为什么块本身没有被编译掉,抱歉.我的猜测似乎太复杂了.

原文链接:https://www.f2er.com/Perl/172273.html

猜你在找的Perl相关文章