Я ожидаю, что пример $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
, но, пожалуйста, смотрите следующие комментарии.
В целом экспорт глобальных переменных из модулей не является хорошей практикой, поскольку он разрушает общий дизайн, запутывая предположительно отдельные компоненты и обходя их интерфейсы. Это также может привести к тонким и трудно обнаруживаемым проблемам.
Наличие глобалов условно кажется странным: как их использовать, если они могут не существовать? Это может быть запутанным дизайном, который может быть изменен