2012-05-02 18 views
-1

私はperlプロジェクトでwokringしているので、動的にperlモジュールを使用する必要があります。私はCT.pmと呼ばれる以下のモジュールを持っています。動的にperlモジュールを使用する

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 help :) thx! :D

+0

これを行う方法が見つかりました - 8時間以内に解決策を投稿できません。 – Diemauerdk

+2

これは前に説明しました:http://stackoverflow.com/questions/251694/how-can-i-check-if-i-have-a-perl-module-before-using-it http:// stackoverflow。 com/questions/1094125/perl-and-print-message-if-module-not-available http://stackoverflow.com/questions/1917261/how-can-i-dynamically -include-perl-modules http://stackoverflow.com/questions/2855207/how-do-i-load-a-module-at-runtime http://stackoverflow.com/questions/3470706/perl-dynamically-include http://stackoverflow.com/questions/3945583/how-can-i-conditionally-use http://stackoverflow.com/questions/6855970/use-of-eval – daxim

答えて

1

あなたのevalは "ブロック評価"であり、実際には通常の "文字列評価"に関連する汚点がない、Perlの例外捕捉機構です。 eval "require $checkHash{'type'}"を介して、文字列evalでモジュールを動的に読み込むことができます。文字列evalをまったく使用しない場合は、barewordモジュール名を手動で.pmファイルパスに変換するだけです。あなたはまだ、モジュールのロードの例外をキャッチするブロックにevalを使用する必要があります。

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

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

関連する問題