我有很多经常被调用的旧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有关,但我似乎无法找到任何证据。
答案 0 :(得分:1)
我认为通过运行某些顶级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
不再那么标准且受到良好支持。