我有很多经常被调用的旧 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),我也尝试在主脚本和我自己的项目中使用无警告“全部”,但它没有做任何事情。
此时,我不知道下一步该做什么,因此感谢所有帮助,我只想抑制警告,代码库相当旧且写得不好,因此要纠正导致警告的每个问题第一名是不可能的。
Apache 服务器也运行 mod_perl,如果这可能会产生影响,我感觉这可能与 CGI 有关,但我似乎找不到任何证据。
我认为代码是通过运行某些顶级 Perl 脚本来调用的。
然后使用__WARN__
挂钩这些脚本以停止打印警告
BEGIN { $SIG{__WARN__} = sub {} };
放置这个BEGIN
之前的块use
语句也会影响模块。
空子例程是静音警告的方法,因为__WARN__
不支持'IGNORE'
.
See warn and %SIG在佩尔瓦尔.
See 这个帖子 and 这个帖子获取评论和一些示例。
要进一步调查并跟踪您可以使用的警告Carp
BEGIN {
$SIG{__WARN__} = \&Carp::cluck; # or Carp::confess; to also die
}
这将使它打印完整的堆栈跟踪。这可以根据您的需要进行微调,因为我们可以编写自己的子程序来调用。或者使用鲤鱼::永远.
See 这个帖子采取一些更严厉的措施(例如推翻核心::全球::警告)
一旦找到更精确的级别来抑制警告,那么local $SIG{__WARN__}
如果可能的话,这是可行的方法。这在上面链接的帖子中使用,这里是另一个例子。当然,只在需要的地方而不是到处抑制警告要好得多。
更多详情
在 Perl 中获取堆栈跟踪?
如何获得 Perl 中的调用堆栈列表?
注意longmess
不幸的是不再那么标准和得到很好的支持。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)