2012-05-02 3 views
-1

Я wokring на perl-проекте, и мне приходится динамически использовать модули 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 в качестве параметра. Этот хэш имеет ключевой тип. Значение, которое этот ключ сопоставляет с именем модуля perl, который я хочу использовать динамически.

Я придумал следующим образом, чтобы сделать это: (который я знаю, не будет работать, и я также знаю, что люди говорят, что Eval плохо):

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

Но идея динамически использовать perl с именем $ checkHash {"type"}.

Если у кого-то есть представление о том, как это сделать, помогите :) 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/try-to-use-module-in-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-condition-use http://stackoverflow.com/questions/6855970/use-of-eval – daxim

ответ

1

Ваш eval является «блоком eval» и на самом деле является единственным механизмом ловли исключения в Perl, не имеющим клейма, связанного с обычной «строковой оценкой». Вы можете динамически загружать модули со строкой eval через eval "require $checkHash{'type'}". Если вы хотите избежать использования строки eval вообще, все, что вам нужно, это просто вручную преобразовать имя модуля с открытым словом в путь к файлу .pm. Вы все еще должны использовать блок Eval для перехвата исключений Модуль загрузки:

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

В этом по-прежнему не будет работать import метод загруженного класса. Вам нужно разбить путь класса на части и найти его вручную. Это также наиболее часто можно безопасно пропустить для классов OO.

Смежные вопросы