Как включить условно модули Perl и библиотеки, а также глобальные переменные из них - PullRequest
0 голосов
/ 27 июня 2018

Я занимаюсь разработкой сценария Perl. Внутри я использую различные модули:

use Module::One;
use Module::Two;
...

Я также использую глобальные переменные из этих модулей:

$GLOBAL_1 = 1;
$GLOBAL_2 = 1;
...

Допустим, имя сценария

my_script.pl

Можно ли условно включить вышеупомянутые модули и глобальные переменные при передаче в сценарий аргумента, называемого no_libs, но всякий раз, когда этот аргумент не передается, не включать или не использовать их? Примерно так:

perl my_cript.pl no_libs

if ( $ARGV[0] eq 'no_libs' ) {
    use Module::One;
    use Module::Two;
    ...

    $GLOBAL_1 = 1;
    $GLOBAL_2 = 1;
    ...
}

1 Ответ

0 голосов
/ 27 июня 2018

Я ожидаю, что пример $ARGV[0] eq '...' действительно означает более сложную обработку аргументов командной строки, включая присваивание переменных и тому подобное. Тогда это происходит во время выполнения, и вы не можете подготовить use таким образом, поскольку он выполняется во время компиляции.

Пример, как указано, работает во время компиляции, в этом случае используйте if pragma

use if @ARGV && ($ARGV[0] eq 'no_libs'), Module::One, qw(...);

, который имеет тот же эффект, что и use Module::One qw(...), если условие истинно.

Если решение действительно происходит во время выполнения, вам нужно использовать require вместо

if ($no_libs) {
    require Module::One;
    Module::One->import( qw(f1 f2) );  # as in: use Module::One qw(f1 f2);
    ...
}

Использование сводится к require, поскольку use Module LIST; означает ровно

BEGIN { require Module; Module->import( LIST ); }

так что вы делаете практически то же самое, но во время выполнения.

Однако глобальные переменные не могут быть импортированы таким образом, поскольку strict не будет иметь своих объявлений во времени. Спасибо икегами за комментарий. Вы можете использовать их непосредственно как $Module::One::Var, для our $Var в Module::One, но, пожалуйста, смотрите следующие комментарии.

В целом экспорт глобальных переменных из модулей не является хорошей практикой, поскольку он разрушает общий дизайн, запутывая предположительно отдельные компоненты и обходя их интерфейсы. Это также может привести к тонким и трудно обнаруживаемым проблемам.

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

...