抑制无法在Perl中找到模块警告

时间:2014-03-18 07:36:02

标签: perl

我在perl后端服务中实现了logger。我正在尝试打印local $SIG{__DIE__}=所包含的内容。

local $SIG{__DIE__}= 

捕获以下错误:无法在@INC中找到xyz.pm(@INC包含...............)。

每当我通过命令行运行脚本时,我都看不到终端上生成的上述错误消息。只需本地$ SIG { DIE } =即可抓住此消息。

有没有办法让supress无法找到警告信息?

我试图通过perl doc(Category Hierarchy)http://perldoc.perl.org/perllexwarn.html,但我不知道,找不到属于哪个类别的警告?

3 个答案:

答案 0 :(得分:3)

这是一个错误,而不是一个警告。您应该修复此错误,因为在安装所需模块之前,您的脚本不会运行。

如果您只是不想记录该特定消息,您可以跳过任何与一些不感兴趣的消息正则表达式相匹配的内容:

my $uninteresting_re = qr{\ACan't locate \w+(?:/\w+)*[.]pm in \@INC [(]you may need to install};

$SIG{__DIE__} = sub {
    my ($error) = @_;
    print $log $error unless $error =~ $uninteresting;
    # let error propagation continue as usual
};

答案 1 :(得分:1)

如果您实际上不需要故障模块来使代码工作,则可以防止生成“无法定位...”错误。在程序开始时(或者至少在尝试加载缺少的模块之前),添加:

use PerlIO::scalar;
BEGIN {
  push @INC, sub { open my $fh, "<", \"1"; return $fh };
}

这会在@INC的末尾添加一个条目,如果找不到实际文件,它将返回一个空的虚拟文件,因此每个use(或require)将始终 找到要加载的内容。

这不是一个好主意。它远远超过更容易掩盖真正的问题而不是解决任何问题。但是,如果你真的想冒这个风险,可以完成。

答案 2 :(得分:1)

编写$SIG{__DIE__}处理程序的正确方法始终是查看$^S的值。这会告诉您当前是否正在运行eval{}。如果是,你应该忽略它。

因此,任何处理程序必须始终启动

$SIG{__DIE__} = sub {
  return if $^S;
  ...
};
相关问题