我是Perl的新手,目前我的任务是整理和维护一个庞大且相当混乱的Perl项目.我正在使用perl-critic来帮助我检测代码中的问题(并教我最佳实践).
现有代码具有编码器创建无法访问代码的位置.例如,他们添加了’&& 0’作为评论一些代码分支的懒惰方式:
if ($req->param('donut') && 0) { unreachable code... } else { always branches to here... }
我希望perl或者Critic会在这种情况下警告我关于无法访问的代码(其中条件有一个常量值评估为false),但事实并非如此.
是否有可以使用的工具或脚本可以可靠地检测出这种东西?
解决方法
使用
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到最后,必须检查它之前的所有条件.它们可能会产生副作用,但仍会发生.此外,&&强制标量上下文,因此它可以在评估条件时更改调用的代码的行为.
这并没有解释为什么块本身没有被编译掉,抱歉.我的猜测似乎太复杂了.