在任何文件中打印时不带“使用警告”或-w的Perl警告语句

时间:2017-08-05 09:14:41

标签: ajax apache perl cgi mod-perl

我有很多经常被调用的旧Perl代码,我一直在编写一个新模块,突然之间我在Apache的error_log中收到很多警告,它们适用于当前使用的每个模块。 e.g,

"my" variable $variable masks earlier declaration in same statement at
    /path/to/module.pm line 40 (#1)

Useless use of hash element in void context at
    /path/to/another/module.pm line 212 (#2)

代码库的主要布局是一个巨大的脚本,其中包含模块并将请求定向到为网站创建特定页面所需的内容,然后主脚本处理菜单等静态元素。

我当前的项目与此主脚本分开并且不使用它,但是每当我使用ajax调用我的代码时,有一些其他的ajax调用将使用主脚本,警告似乎只出现在那些请求中但只有当我打电话给我的项目时。

我已经对每个模块进行了grepped,并且没有人在其中使用警告(或-w),我也尝试在主脚本和我自己的项目中不使用“all”警告,但它没有做任何事情。

此时我不知道下一步该做什么,所以所有的帮助都很受欢迎,我只想抑制警告,代码库已经很老了,编写得很糟糕,所以去纠正导致首先警告是不可行的。

Apache服务器也运行mod_perl,如果这可能有所不同,我觉得它可能与CGI有关,但我似乎无法找到任何证据。

1 个答案:

答案 0 :(得分:1)

我认为通过运行某些顶级Perl脚本来调用代码。

然后使用这些脚本中的__WARN__挂钩停止打印警告

BEGIN { $SIG{__WARN__} = sub {} };

将此BEGIN块放在use语句之前,以便影响模块。

由于__WARN__不支持'IGNORE',因此空子程序是静音警告的方法。

请参阅warn%SIG in perlvar。 有关评论和一些示例,请参阅this postthis post

要进一步调查并跟踪警告,可以使用Carp

BEGIN {
    $SIG{__WARN__} = \&Carp::cluck;  # or Carp::confess; to also die
}

将使其打印完整的堆栈跟踪,以及可以进行微调的内容。或者使用Carp::Always

参见this post 对于一些更激烈的措施(如重写CORE::GLOBAL::warn

一旦找到更精确的抑制警告级别,那么local $SIG{__WARN__}就是可行的方法。这用于上面链接的帖子,这里是another example。当然,最好只在需要的地方而不是在任何地方压制警告。

更多细节

请注意,遗憾的是,longmess不再那么标准且受到良好支持。