2012-08-29 4 views
2

J'ai un script Perl qui utilise Module::Reload::Selective pour charger un module. Le script perl ressemble à ceci, plus ou moins.Perl 1 000 sous-programme redéfini

#!/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}; 
} 

Le module ressemble à ceci:

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; 

Quand je lance le script principal que je reçois environ 100 comme ceci:

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. 

J'ai remarqué si je commente quelques-uns des " utiliser "déclarations dans mon module ceux-ci vont disparaître. Mais j'ai besoin de ceux-là. J'ai cherché partout et essayé un certain nombre de choses. en vain.

+1

Le code que vous avez posté ne donne pas l'erreur que vous décrivez. – ikegami

Répondre

2

Parfois, il est correct de redéfinir les sous-programmes. Si vous savez ce que vous faites et que vous voulez supprimer les avertissements, il suffit de mettre

no warnings 'redefine'; 

en haut de votre méthode reload.


Une autre option, encore une fois, tant que vous savez ce que vous faites, est de désactiver temporairement le gestionnaire d'avertissements builtin:

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

Et en dernier recours, étant donné que les avertissements sont écrits à STDERR, vous pouvez temporairement rediriger STDERR.

sub reload { 
    open my $devnull, '>/dev/null'; # Windows: >nul 
    local *STDERR = *$devnull; 
    ... do something that warns ... 
} 
+0

J'ai ajouté la déclaration de non-avertissements mais je les reçois toujours. – gdanko

1

Je l'avais aussi. Dans mon cas j'ai suivi l'erreur jusqu'à l'appel de plugins() dans Module :: Pluggable. Si c'est de là que vient votre bruit, cela pourrait aussi fonctionner pour vous.

réponse est dans les mauvaises herbes ici: http://cpansearch.perl.org/src/SIMONW/Module-Pluggable-5.1/lib/Module/Pluggable.pm

où il explique que les plugins() est appelé plus que nécessaire, qui peut coûter cher, si vous faites quelque chose comme ceci:

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

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

Ce n » ai pas Je travaillais exactement pour moi au début, mais c'était le cas lorsque j'ai étoffé le plugin plugins() en plusieurs lignes et peuplé/retourné un tableau ref dans mon $ self.

Questions connexes