2012-08-29 25 views
2

我有一个Perl脚本,它使用Module::Reload::Selective加载模块。 Perl脚本看起来像这样,或多或少。Perl 1,000子程序重新定义

#!/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. 

我发现,如果我注释掉一些“使用“在我的模块中的声明这些将消失。但我需要那些。我搜遍了各种各样的东西。无济于事。

+1

您发布的代码不会给出您描述的错误。 – ikegami

回答

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 ... 
} 
+0

我加了没有警告声明,但我仍然得到它们。 – gdanko

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; 

这没” t刚好适用于我,但是当我充实plugins()sub成几行并在我的$ self中填充/返回一个数组ref时,确实如此。