我有一个Perl模块(Module.pm),用于初始化一些变量,其中一些我想将它导入($ VAR2,$ VAR3)到其可能载入的其他子模块中执行。Perl从调用模块导入变量
我目前正在设立Module.pm的方法如下:
package Module::SubModule1;
use warnings;
use strict;
use Carp;
use vars qw();
sub new {
my ($package) = @_;
my $self = {};
bless ($self, $package);
return $self;
}
我希望能够导入$ VAR2:
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'};
}
每个子模块的结构如下和$ 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;
}
请让我知道我能成功地从Module.pm出口$ VAR2和$ VAR3到每个子模块。在此先感谢您的帮助!
规则 - 我认为这将创建一个多实例的情况,因为我只希望Module.pm的一个实例运行并在SubModule1.pm和SubModule2.pm中共享它的GLOBAL变量,所以基本上如果SubModule1.pm中的函数修改$ VAR2那么可以通过Module.pm和其他子模块访问该修改。将添加'使用模块;'正如您在子模块中所建议的那样创建了这种期望的效果?如果不是的话,还有什么可以完成的呢? – 2010-08-31 20:50:14
是的,它会产生所需的效果,但如果您希望的效果是将行为从一个包中任意更改的包中移除,那么您会很好地重新考虑您的设计。 – friedo 2010-08-31 21:12:31
@friedo - 我很乐意提供一些关于改变设计方式的建议,因为我知道使用或更改GLOBALS并不理想。我希望这些变量是全局的原因是因为Module.pm正在作为我们的控制器并设置了一堆GLOBAL变量,如我们的域的URL,数据目录的位置等。由于Module.pm然后正在加载无论需要哪个子模块来呈现相应的页面,我都希望所有子模块能够引用,使用,并且在一些特殊情况下修改这些全局变量。还有另一种更理想的方法来设置它吗? – 2010-08-31 21:21:46