3

我有一个使用Module::Reload::Selective加载模块的 Perl 脚本。perl 脚本或多或少看起来像这样。

#!/usr/bin/perl

use strict;
use warnings;
use Module::Reload::Selective;

&reload;

sub reload {
    Module::Reload::Selective->reload(qw(myModule));
    import myModule qw($reloadtime);
    $reloadtime = ${myModule::reloadtime};
}

该模块如下所示:

package myModule;

use Config::General;
use Data::Dumper;
use DBI;
use HTTP::Request::Common qw { POST };
use HTTP::Headers;
use JSON::XS;
use LWP::UserAgent;
use Module::Pluggable search_path => "Bot";
use POSIX qw(strftime ceil);

# stuff here
1;

当我运行主脚本时,我得到大约 100 个这样的:

Subroutine export_fail redefined at /usr/local/share/perl/5.14.2/Carp.pm line 64.
Subroutine _cgc redefined at /usr/local/share/perl/5.14.2/Carp.pm line 66.
Subroutine longmess redefined at /usr/local/share/perl/5.14.2/Carp.pm line 72.
Subroutine shortmess redefined at /usr/local/share/perl/5.14.2/Carp.pm line 92.
Subroutine croak redefined at /usr/local/share/perl/5.14.2/Carp.pm line 100.
Subroutine confess redefined at /usr/local/share/perl/5.14.2/Carp.pm line 101.
Subroutine carp redefined at /usr/local/share/perl/5.14.2/Carp.pm line 102.

我注意到如果我注释掉模块中的一些“使用”语句,这些语句就会消失。但我需要那些。我已经到处搜索并尝试了很多东西。无济于事。

4

2 回答 2

2

有时可以重新定义子程序。如果您知道自己在做什么并想取消警告,只需输入

no warnings 'redefine';

在您的reload方法的顶部。


同样,只要您知道自己在做什么,另一种选择是暂时禁用内置警告处理程序:

sub reload {
    local $SIG{__WARN__} = sub {};
    ... do something that warns ...
}

作为最后的手段,由于警告被写入STDERR,您可以暂时重定向STDERR

sub reload {
    open my $devnull, '>/dev/null';  # Windows: >nul
    local *STDERR = *$devnull;
    ... do something that warns ...
}
于 2012-08-29T18:36:26.247 回答
1

我也有这个。就我而言,我将错误跟踪到 Module::Pluggable 中的 plugins() 调用。如果这也是您的噪音的来源,那么这也可能对您有用。

答案就在这里:http ://cpansearch.perl.org/src/SIMONW/Module-Pluggable-5.1/lib/Module/Pluggable.pm

它解释了 plugins() 被调用超过必要的,这可能会变得昂贵,所以你做这样的事情:

package Foo;
  use strict;
  use Module::Pluggable sub_name => '_plugins';

  our @PLUGINS;
  sub plugins { @PLUGINS ||= shift->_plugins }
  1;

起初这对我来说并不完全有效,但是当我将 plugins() sub 充实成几行并在我的 $self.

于 2014-09-25T19:06:08.583 回答