任何方法可以关闭 Perl 中“use Module”语句中生成的警告

Yon*_*k64 4 perl

XML::LibXML我目前正在Perl 脚本中使用该模块。XML::LibXML我们当前在机器上使用的模块是针对较新版本的库进行编译的,libxml2并且 use 语句生成以下警告:

Warning: XML::LibXML compiled against libxml2 20708, but runtime libxml2 is older 20706
Run Code Online (Sandbox Code Playgroud)

该警告不会影响我的脚本的性能。我已经和我的主管谈过了,她说对于我们当前的目的来说,这个错误可以完全忽略。有没有办法暂时关闭此警告而不关闭所有警告?我尝试将use语句包含在代码块内{}并使用 关闭警告no warnings;,但我仍然收到警告。

Kei*_*son 5

warn您可以通过设置 来禁止警告,即使是像这样由于显式调用函数而发出的警告$SIG{__WARN__}

一个简单的工作示例(由于 ysth 的评论而改进):

mod.pm:

package mod;

sub method {
    print "This is mod::method\n";
}

warn "WE DO NOT WANT THIS WARNING\n";

1;
Run Code Online (Sandbox Code Playgroud)

foo.pl:

#!/usr/bin/perl

use strict;
use warnings;

BEGIN {
    local $SIG{__WARN__} = sub {};
    require mod;
    mod::->import();
}

warn "Normal warnings work\n";
mod::method();
Run Code Online (Sandbox Code Playgroud)

输出是:

Normal warnings work
This is mod::method
Run Code Online (Sandbox Code Playgroud)

我已经确认注释掉 的设置会$SIG{__WARN__}导致出现“不想要”警告。

  • “BEGIN”表示在此块之后停止编译并在恢复编译之前运行它。`use` 表示在恢复编译之前加载此模块并运行其主线代码和导入方法。因此,在 BEGIN 块内使用时,它仍然会在 %SIG 分配实际运行之前发生。`BEGIN { 本地 $SIG...; 需要模组;mod::->import() }` 可以工作 (4认同)