3

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.

モジュール内の「use」ステートメントの一部をコメントアウトすると、これらがなくなることに気付きました。しかし、私はそれらが必要です。色々と調べて色々試してみました。無駄に。

4

2 に答える 2

2

サブルーチンを再定義しても問題ない場合があります。自分が何をしているのかを知っていて、警告を抑制したい場合は、

no warnings 'redefine';

メソッドの上部にありますreload


もう 1 つのオプションは、何をしているのかを理解している限り、組み込みの警告ハンドラーを一時的に無効にすることです。

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 ...
}
于 2012-08-29T18:36:26.247 に答える
1

私もこれを持っていました。私の場合、Module::Pluggable の plugins() 呼び出しまでエラーを追跡しました。それがあなたのノイズの原因でもある場合、これもうまくいくかもしれません。

答えは雑草の中にあります: http://cpansearch.perl.org/src/SIMONW/Module-Pluggable-5.1/lib/Module/Pluggable.pm

ここでは、 plugins() が必要以上に呼び出され、コストがかかる可能性があることを説明しているため、次のようにします。

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

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

最初はうまくいきませんでしたが、plugins() サブルーチンをいくつかの行に分けて、$self に配列リファレンスを入力/返すとうまくいきました。

于 2014-09-25T19:06:08.583 に答える