重新定义了Perl 1,000子程序

时间:2012-08-29 18:20:03

标签: perl

我有一个使用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.

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

2 个答案:

答案 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中的数组引用时就做了。