2017-01-27 1 views
2

Можно ли обратиться к модулю perl, имя которого будет передано как аргумент командной строки?как обратиться к модулю perl, чье имя будет передано во время выполнения?

Я могу сделать use $ARGV[0], чтобы получить модуль, но как я могу ссылаться на что-либо импортированное EXPORT_OK в модуле?

+0

Также см. Переключатель ['-M' в perlrun] (https://metacpan.org/pod/perlrun#-m [-]), чтобы указать модуль для загрузки из командной строки. – mob

+4

Почему downvotes? На самом деле это хороший вопрос. –

+0

@ChankeyPathak Я тоже не знаю, почему, но тег [tag: perl] является одним из наиболее неизменно отрицательных мест на SO. –

ответ

1

UNIVERSAL::require изготовлен для этой цели только.

Описание:require() модули из переменной

фрагмент:

require UNIVERSAL::require; 

my $module = $ARGV[0]; 
$module->require or die [email protected]; 

my $require_return = $module->use(@imports) or die [email protected]; 
+0

Но это во время работы, не так ли? – simbabque

1

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

my $module_path = $module_name; 
$module_path =~ s{::}{/}g; 
$module_path .= '.pm'; 
require $module_path; 

или

$module_name !~ /^\w+(?:::\w+)*\z/ 
    or die("Bad module name\n"); 

eval("use $module_name qw(); 1") 
    or die [email protected]; 

Это не импорт, так как импортировать его во время выполнения не имеет смысла. Вы хотите импортировать из модулей, что означает, что вы действительно хотите загрузить модуль во время компиляции. Следующий удобный трюк:

use if 1, $module_name, @imports; 

Вы также можете использовать одно из следующих действий:

BEGIN { 
    my $module_path = $module_name; 
    $module_path =~ s{::}{/}g; 
    $module_path .= '.pm'; 
    require $module_path; 
    import $module_name @imports; 
} 

или

BEGIN { 
    $module_name !~ /^\w+(?:::\w+)*\z/ 
     or die("Bad module name\n"); 

    eval("use $module_name \@imports; 1") 
     or die [email protected]; 
} 

Есть модули, которые также могут помочь.

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