我有一個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