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

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

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

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

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

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

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

解决方法

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

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

@H_502_4@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到最后,必须检查它之前的所有条件.它们可能会产生副作用,但仍会发生.此外,&&强制标量上下文,因此它可以在评估条件时更改调用代码的行为.

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

猜你在找的Perl相关文章