gpt4 book ai didi

Perl 执行/忽略代码的方式(如 C 中的断言)

转载 作者:行者123 更新时间:2023-12-01 08:52:37 25 4
gpt4 key购买 nike

我是 Perl 编程的真正初学者(Debian 8 上的 v 5.20.2),我正在寻找一种在不需要时在 Perl 执行时实现“调试”而没有开销的方法调试。

在 C 中,我们可以使用 assert-D gcc 选项来做到这一点(通常,您可以按照与您的自己定义常量,如 MY_DEBUG)。

好吧,第一个想法是简单地设置一个全局变量debug并再次测试它,但是当我不想处于 Debug模式时它会生成一堆无用的测试。

有像 assertions 这样的 CPAN 模块或 Carp::Assert , 但似乎即使我不想调试也会有一个 if 测试。

是否有一种 Perl 方法可以根据“某事”停用部分代码?

额外问题:我想制作一个具有相同功能的 Perl 模块,所以如果在我执行 use MyModule 时有办法说“启用/禁用调试”,那么我会做一个快乐的 Perl 开发者。

最佳答案

Perl 没有内置的。由于 Perl 是一种解释性语言,因此也不会像在 C 中那样进行编译。 Carp::Assert 的事实存在(并且是由参与 Perl 核心的人编写的)是一个非常好的断言(双关语),表明 Perl 中没有直接存在此功能。

一般来说,几个 if DEBUGif $debug 或类似的没什么大不了的。今天的计算机是如此之快,以至于这些操作几乎无关紧要,除非你将它们置于一个被调用数百万次的循环中,或者你有极其时间关键的代码。在您的普通程序中,您可以忽略该开销。

事实上 perl1 如果你使用一个常量,将会优化那些。考虑这个程序。

use constant DEBUG => 1;
print "stuff" if DEBUG;

如果使用 B::Deparse 运行,它将产生以下输出。

$ perl -MO=Deparse scratch.pl 
use constant ('DEBUG', 1);
print 'stuff';
scratch.pl syntax OK

这是我们的 print 语句。但是如果你把 DEBUG 常量变成 0 并运行同样的命令,你会得到别的东西。

$ perl -MO=Deparse scratch.pl 
use constant ('DEBUG', 0);
'???';
scratch.pl syntax OK

如您所见,print 不见了。剩下的就是 '???';,这是一个 NOOP。

让我们用 B::Concise 运行同样的东西.首先,将DEBUG转为0

$ perl -MO=Concise scratch.pl 
3 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 120 scratch.pl:1129) v:{ ->3
- <0> ex-const v*/4,FOLD ->3
scratch.pl syntax OK

然后将 DEBUG 设置为 1

$ perl -MO=Concise scratch.pl 
6 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 120 scratch.pl:1129) v:{ ->3
5 <@> print vK/FOLD ->6
3 <0> pushmark s ->4
4 <$> const(PV "stuff") s ->5
scratch.pl syntax OK

如您所见,还有更多操作。 print "stuff"if DEBUG 实际上被优化了。这与您在 C 示例中描述的内容几乎相同。

继续尝试这两个模块,看看它在使用 Carp::Assert 时的行为是否相同.


如果您不喜欢这样,请查看 Smart::Comments .它引入了在您 use 时执行的注释语法。这很酷,因为当你不加载模块时,它们可以坐在那里不做任何事情。

use Smart::Comments;

my $var = suspect_value();

### $var

还有Devel::Comments ,这似乎也是如此。

1) 带有小 p 的 perl 是解释器程序,而不是语言

关于Perl 执行/忽略代码的方式(如 C 中的断言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38219085/

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