繁体   English   中英

在任何文件中没有“使用警告”或 -w 打印的 Perl 警告

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM