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

我如何警告`perl -c`中的函数用法?

发布时间:2020-12-15 23:33:02 所属栏目:大数据 来源:网络整理
导读:我们的代码库包括各种只应用于测试的调试钩子.作为说明性示例: sub example { my ($arg) = @_; my $result = do_something_with($arg); debug_dump_values($arg); # debugging code return $result;} 当然,不应提交(甚至部署)此类调试代码.有没有办法在通过
我们的代码库包括各种只应用于测试的调试钩子.作为说明性示例:

sub example {
   my ($arg) = @_;
   my $result = do_something_with($arg);
   debug_dump_values($arg); # debugging code
   return $result;
}

当然,不应提交(甚至部署)此类调试代码.有没有办法在通过perl -c运行此代码时生成警告?有点像

Debug function debug_dump_values() called at example.pl line 4.

这可以作为运行时警告实现:

sub debug_dump_values {
    carp "Debug function debug_dump_values() called";
    ...
}

但我希望通过其syntax check plugin在我的文本编辑器中显示警告,因此它需要是一个“编译时”警告.

解决方法

我认为这不是一件容易实现的事情 – 如果没有一些重要的编码风格重新调整,这是不可能的.

我能想到的方法:

将“调试”代码放入单独的模块中.

在模块中嵌入一个警告,指示它已启用 – 嵌入在’BEGIN’块中. (这不一定会告诉你哪个子被调用,也不一定在哪里)

例如.

BEGIN { 
    carp "Debugging module is imported" 
}

这样做的好处可能是 – 你可以有一个’debug’和’not debug’模块,并且两者都有相同的subs. ‘不调试’会放入虚拟潜艇.

然后,您可以使用B::Lint验证模块并检查是否已定义了所有模块:

perl -MO = Lint [,OPTIONS] foo.pl

未定义,潜艇
无论何时调用未定义的子例程,此选项都会发出警告.此选项仅捕获显式调用的子例程(如foo()),而不捕获间接调用(如& $subref()或$obj-> meth()).请注意,某些程序或模块通过AUTOLOAD机制将subs的定义延迟到运行时

通过参考分配您的子.

编辑:不能像我想的那样工作 – 有一个声明匿名子和在’BEGIN’块中创建引用的概念 – 这不像我想的那样好 – 它只在运行时出错,因为你得到的错误范围.

我能提供的最好的是:

use strict;
use warnings;

my $debug = 1;

##debug code bit. 
#Comment out if not needed
my $debug_sub = gimme_debug();

sub gimme_debug {
    if ( $debug ) { 
        warn "Debugging enabledn"; 
        return sub { print "Got values of :",@_,"n"; };
    }
    else { warn "Debug subroutine defined with debug disabled!" };
}

#... way down code ... 

&$debug_sub ( "Some input" );

如果你删除声明,那么你将获得编译时警告,因为$debug_sub是未声明的.这可能与上述结合,例如将其捆绑在模块或对象中.

自动化测试

它并没有特别针对您的要求,但无论如何您可能还想考虑它.自动测试代码/模块.例如,使用TAP::Harness.它比你要求的更复杂和密集,但有一些东西会自动陷阱调试代码(以及以其他方式验证代码的各个组件)可能是’正确’的方法它.

我也听说过(但没有做太多)Class::Inspector可能适合您的需要.
但我认为在一个相当基础的层面 – 你在编译时没有检查你要做的事情,因为在没有实际运行代码的情况下评估实际调用哪些代码是非常困难的.所以你做的任何事情都是你必须以某种方式“手工管理”的东西.

The Halting Problem

“在可计算性理论中,暂停问题是从任意计算机程序和输入的描述中确定程序是否将完成运行或继续永久运行的问题.

Alan Turing在1936年证明,不存在解决所有可能的程序输入对的暂停问题的通用算法.证明的一个关键部分是计算机和程序的数学定义,它被称为图灵机;暂停问题对于图灵机来说是不可判定的.这是决策问题的第一个例子之一.“

所以,如果你确实想出了一个很好的解决方案 – 可能会提供一个非常有用的大奖:).

(编辑:李大同)

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

    推荐文章
      热点阅读