2012-08-29 30 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時,確實如此。