Perl从调用模块导入变量

Rus*_* C. 0 oop perl perl-module

我有一个Perl模块(Module.pm)初始化一些变量,其中一些我想导入($ VAR2,$ VAR3)到其他可能在执行期间加载的子模块.

我目前设置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'};
}
Run Code Online (Sandbox Code Playgroud)

每个子模块的结构如下:

package Module::SubModule1;

use warnings;
use strict;
use Carp;

use vars qw();

sub new {
    my ($package) = @_;
    my $self = {};
    bless ($self, $package);
    return $self;
}
Run Code Online (Sandbox Code Playgroud)

我希望能够将$ 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;
}
Run Code Online (Sandbox Code Playgroud)

请告诉我如何将Module.pm中的$ VAR2和$ VAR3成功导出到每个子模块中.在此先感谢您的帮助!

mob*_*mob 5

在你的子模块中,你忘了说

use Module;
Run Code Online (Sandbox Code Playgroud)

?use Module从另一个包调用(比如说Module::Submodule9)将尝试运行该Module::import方法.由于你没有那个方法,它会调用Exporter::import方法,这就是将命令导出Module到Module::Submodule9命名空间的魔法.


在您的程序中,只有一个Module名称空间,只有一个(全局)变量的实例$Module::VAR2.导出会在其他名称空间中为此变量创建别名,因此可以通过不同方式访问同一变量.在单独的脚本中尝试此操作:

package Whatever;
use Module;
use strict;
use vars qw($VAR2);

$Module::VAR2 = 5;
print $Whatever::VAR2;    # should be 5.
$VAR2 = 14;               # same as $Whatever::VAR2 = 14
print $Module::VAR2;      # should be 14
Run Code Online (Sandbox Code Playgroud)

  • @Russell:根本不使用全局变量.使用OO设计,并将状态值存储在适当的任何类中. (3认同)
  • 是的,它会产生预期的效果,但是如果你想要的效果是将一个包中的全局变量的行为基于另一个包任意改变,那么你应该认真地重新考虑你的设计. (2认同)