加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读