Для этого может пригодиться модуль if
.
В противном случае основная идея заключается в использовании require
, который происходит во время выполнения, вместо use
, который происходит во время компиляции. Обратите внимание, что '
BEGIN {
my $module = $condition ? $Module1 : $Module2;
my $file = $module;
$file =~ s[::][/]g;
$file .= '.pm';
require $file;
$module->import;
}
Что касается адресации глобальных переменных, может быть проще, если вы просто экспортировали переменную или функцию, возвращающую ее вызывающей стороне, которую вы могли бы использовать по ее безусловному имени. В противном случае есть также возможность использовать метод и вызывать его как $Module->method_name
.
В качестве альтернативы, вы можете использовать символические ссылки, как описано в perlref
. Однако, это обычно довольно неприятный запах.
my @array = do {
no strict 'refs';
@{ ${ "${Module}::Array_inside_module" } };
};