[英]Perl warning printed without 'use warnings' or -w in any files
我有很多经常被调用的旧 Perl 代码,我一直在编写一个新模块,突然间我在我的 Apache 错误日志中收到了很多警告,它们针对当前正在使用的每个模块。 例如,
"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 调用将使用主脚本并且警告似乎只从这些请求中出现,但仅当我正在调用我的项目。
我已经搜索了每个模块,但没有一个模块在其中使用警告(或 -w),我也尝试在主脚本和我自己的项目中不使用警告“全部”,但它没有做任何事情。
在这一点上,我不知道下一步该做什么,因此感谢所有帮助,我只想抑制警告,代码库很旧而且写得不好,所以继续并纠正导致警告的每个问题第一名是不可行的。
Apache 服务器也在运行 mod_perl,如果这可能会有所作为,我觉得这可能与 CGI 有关系,但我似乎找不到任何证据。
我认为通过运行某些顶级 Perl 脚本来调用代码。
然后在这些脚本中使用__WARN__
钩子来停止打印警告
BEGIN { $SIG{__WARN__} = sub {} };
将此BEGIN
块放在use
语句之前,以便也影响模块。
空子例程是静音警告的方法,因为__WARN__
不支持'IGNORE'
。
请参阅perlvar 中的warn和%SIG
。 请参阅此帖子和此帖子以获取评论和一些示例。
要进一步调查并跟踪警告,您可以使用Carp
BEGIN {
$SIG{__WARN__} = \&Carp::cluck; # or Carp::confess; to also die
}
这将使它打印完整的堆栈跟踪。 这可以根据您的喜好进行微调,因为我们可以编写自己的 sub 来调用。 或者使用Carp::Always 。
有关一些更严厉的措施(例如覆盖CORE::GLOBAL::warn ),请参阅此帖子
一旦你找到一个更精确的级别来抑制警告,那么如果可能的话, local $SIG{__WARN__}
就是要走的路。 这在上面链接的帖子中使用,这是另一个示例。 仅在需要的地方而不是在任何地方抑制警告当然要好得多。
更多细节
请注意,不幸的是longmess
不再那么标准和得到很好的支持。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.