我有一个使用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.
我注意到如果我在我的模块中注释掉一些“使用”语句,它们就会消失。但我需要那些。我到处搜索过并试过很多东西。无济于事。
答案 0 :(得分: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 ...
}
答案 1 :(得分:1)
我也有这个。在我的例子中,我将错误跟踪到Module :: Pluggable中的plugins()调用。如果您的噪音来自于此,这也可能对您有用。
答案在这里的杂草中:http://cpansearch.perl.org/src/SIMONW/Module-Pluggable-5.1/lib/Module/Pluggable.pm
它说明插件()的调用超过了必要的费用,所以你可以这样做:
package Foo;
use strict;
use Module::Pluggable sub_name => '_plugins';
our @PLUGINS;
sub plugins { @PLUGINS ||= shift->_plugins }
1;
一开始我并没有完全适合我,但是当我将插件()sub充实到几行并填充/返回我的$ self中的数组引用时就做了。