gpt4 book ai didi

perl - 如何在 Perl 条件中检测无法访问的代码,它总是评估为假?

转载 作者:行者123 更新时间:2023-12-04 05:50:20 25 4
gpt4 key购买 nike

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

这并不能解释为什么块本身没有被编译掉,抱歉。我的猜测是它看起来太复杂了。

关于perl - 如何在 Perl 条件中检测无法访问的代码,它总是评估为假?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23336115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com