-1

私は perl プロジェクトに取り組んでおり、perl モジュールを動的に使用する必要があります。CT.pm という次のモジュールがあります。

sub new {
    my $class = shift;
    my ($debug, $debug_matches,%checkHash) = @_;
    my $self = {};
    $self->{DEBUG} = shift;
    $self->{DEBUG_MATCHES} = shift;
    $self->{CHECKRESULT_OK} = "COMPLIANT"; 
    $self->{CHECKRESULT_ERROR} = "NONCOMPLIANT"; 
    %{$self->{checkHash}} = %checkHash;

    eval{
        use $checkHash{"type"};
        $check = $checkHash{"type"}->new($self->{DEBUG},$self->{DEBUG_MATCHES},%checkHash);
    };

    bless($self,$class);
    return $self;
}

このコンストラクターは、%checkHash というハッシュをパラメーターとして取得します。このハッシュには type というキーがあります。このキーが動的に使用したい perl モジュールの名前にマップされる値。

私はそれを行うための次の方法を思いつきました:(これは機能しないことを知っており、evalが悪いと人々が言うことも知っています):

eval{
    use $checkHash{"type"};
    $check = $checkHash{"type"}->new($self->{DEBUG},$self->{DEBUG_MATCHES},%checkHash);
};

しかし、アイデアは、$checkHash{"type"} という名前の perl モジュールを動的に使用することです。

誰かがこれを行う方法について何か考えを持っている場合は、plsを助けてください:) thx! :D

4

1 に答える 1

1

evalこれは「ブロック eval」であり、実際には Perl の単なる例外キャッチ メカニズムであり、通常の「文字列 eval」に関連するスティグマがありません。eval を介して文字列 eval でモジュールを動的にロードできます"require $checkHash{'type'}"。文字列 eval をまったく使用したくない場合は、bareword モジュール名を手動で .pm ファイル パスに変換するだけで済みます。モジュールの読み込み例外をキャッチするには、引き続きブロック eval を使用する必要があります。

my $file = $class . '.pm';
$file =~ s{::}{/}g;
eval { require $file };
if($@){ die "failed to load $class: $@" }

importこれでも、ロードされたクラスメソッドは実行されません。クラスパスをバラバラにして手動で見つける必要があります。これも、ほとんどの場合、OO クラスでは安全にスキップできます。

于 2012-05-02T08:29:24.343 に答える