我有很多经常调用的旧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有关,但我似乎无法找到任何证据。
我认为通过运行某些顶级Perl脚本来调用代码。
然后在这些脚本中使用__WARN__
钩子来停止打印警告
BEGIN { $SIG{__WARN__} = sub {} };
将此BEGIN
块放在use
语句之前,以便影响模块。
由于__WARN__
不支持'IGNORE'
,因此空子程序是静音警告的方法。
见warn和%SIG
in perlvar。有关评论和一些示例,请参阅this post和this 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
不再那么标准且得到很好的支持。