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

问题描述 投票:1回答:1

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

"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调用将使用主脚本,警告似乎只出现在那些请求中,但仅限于我在叫我的项目。

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

在这一点上,我没有关于下一步该做什么的想法,所以所有的帮助都很受欢迎,我只想抑制警告,代码库已经很老了,编写得很糟糕所以去纠正导致警告的每个问题。第一名是不可行的。

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

ajax apache perl cgi mod-perl
1个回答
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不再那么标准且得到很好的支持。

© www.soinside.com 2019 - 2024. All rights reserved.