如何在Perl条件中检测无法访问的代码,总是求值为false?
发布时间:2020-12-15 21:42:10 所属栏目:大数据 来源:网络整理
导读:我是Perl的新手,目前我的任务是整理和维护一个庞大且相当混乱的Perl项目.我正在使用perl-critic来帮助我检测代码中的问题(并教我最佳实践). 现有代码具有编码器创建无法访问代码的位置.例如,他们添加了’ 0’作为评论一些代码分支的懒惰方式: if ($req-para
我是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到最后,必须检查它之前的所有条件.它们可能会产生副作用,但仍会发生.此外,&&强制标量上下文,因此它可以在评估条件时更改调用的代码的行为. 这并没有解释为什么块本身没有被编译掉,抱歉.我的猜测似乎太复杂了. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |