У меня есть модуль Perl (Module.pm), который инициализирует ряд переменных, некоторые из которых я хотел бы импортировать ($ VAR2, $ VAR3) в дополнительные подмодули, которые он мог бы загружать во время выполнение.Perl Импорт переменных из вызывающего модуля
Путь я в настоящее время настройки Module.pm выглядит следующим образом:
package Module;
use warnings;
use strict;
use vars qw($SUBMODULES $VAR1 $VAR2 $VAR3);
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw($VAR2 $VAR3);
sub new {
my ($package) = @_;
my $self = {};
bless ($self, $package);
return $self;
}
sub SubModules1 {
my $self = shift;
if($SUBMODULES->{'1'}) { return $SUBMODULES->{'1'}; }
# Load & cache submodule
require Module::SubModule1;
$SUBMODULES->{'1'} = Module::SubModule1->new(@_);
return $SUBMODULES->{'1'};
}
sub SubModules2 {
my $self = shift;
if($SUBMODULES->{'2'}) { return $SUBMODULES->{'2'}; }
# Load & cache submodule
require Module::SubModule2;
$SUBMODULES->{'2'} = Module::SubModule2->new(@_);
return $SUBMODULES->{'2'};
}
Каждый подмодуль структурирована следующим образом:
package Module::SubModule1;
use warnings;
use strict;
use Carp;
use vars qw();
sub new {
my ($package) = @_;
my $self = {};
bless ($self, $package);
return $self;
}
Я хочу, чтобы иметь возможность импортировать $ var2 и $ VAR3 в каждый из подмодулей без необходимости ссылаться на них как на $ Module :: VAR2 и $ Module :: VAR3. Я заметил, что вызывающий скрипт имеет доступ к обеим переменным, которые я экспортировал в Module.pm желаемым образом, но SubModule1.pm и SubModule2.pm все равно должны ссылаться на переменные как на Module.pm.
Я попытался обновить каждый подмодуль следующим образом, который, к сожалению, не получилось, я надеялся:
package Module::SubModule1;
use warnings;
use strict;
use Carp;
use vars qw($VAR2 $VAR3);
sub new {
my ($package) = @_;
my $self = {};
bless ($self, $package);
$VAR2 = $Module::VAR2;
$VAR3 = $Module::VAR3;
return $self;
}
Пожалуйста, дайте мне знать, как я могу успешно экспортировать $ var2 и $ var3 от Module.pm в каждом подмодуль. Заранее спасибо за вашу помощь!
правило - я думал, что создаст ситуацию с несколькими экземплярами, так как мне нужен только один экземпляр Module.pm, который запускает и разделяет его GLOBAL-переменные в SubModule1.pm и SubModule2.pm, так что если функция в SubModule1.pm изменяет $ VAR2 то эта модификация будет доступна через Module.pm и другие подмодули. Добавил бы «Use Module»; как вы предложили в подмодулях создать этот желаемый эффект? Если нет, как еще это можно сделать? –
Да, это будет иметь желаемый эффект, но если ваш желаемый эффект заключается в том, чтобы сфокусировать поведение глобальных переменных в одном пакете, которые произвольно изменены другим, вам следует серьезно пересмотреть ваш дизайн. – friedo
@friedo - Мне хотелось бы посоветовать, как мы можем рассмотреть возможность изменения дизайна, поскольку я знаю, что он не идеален для использования или изменения GLOBALS. Причина, по которой я хочу, чтобы эти переменные были глобальными, заключается в том, что Module.pm действует нашим контроллером и настраивает группу глобальных переменных, таких как URL нашего домена, расположение каталога данных и т. Д. Так как Module.pm загружается любые подмодули, необходимые для отображения соответствующей страницы, я хотел бы, чтобы все подмодули могли ссылаться, использовать и в некоторых особых обстоятельствах изменять эти глобальные переменные. Есть ли еще один идеальный способ установить это? –