0

我有一个 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'};
}

每个子模块的结构如下:

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;
}

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

4

2 回答 2

5

在您的子模块中,您是否忘记说

use Module;

? use Module从另一个包(比如)调用Module::Submodule9将尝试运行该Module::import方法。由于您没有该方法,因此它将调用该方法,这就是将 export的变量导入命名空间Exporter::import的神奇之处。ModuleModule::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
于 2010-08-31T20:38:24.710 回答
0

那么有一个简单的方法:

在下午:

package M;

use strict;
use warnings;

#our is better than "use vars" for creating package variables
#it creates an alias to $M::foo named $foo in the current lexical scope 
our $foo = 5;

sub inM { print "$foo\n" }

1;

在 M/S.pm

package M;

#creates an alias to $M::foo that will last for the entire scope,
#in this case the entire file
our $foo;

package M::S;

use strict;
use warnings;

sub inMS { print "$foo\n" }

1;

在脚本中:

#!/usr/bin/perl

use strict;
use warnings;

use M;
use M::S;

M::inM();
M::S::inMS();

但我建议不要这样做。全局变量不是一个好习惯,在模块之间共享全局变量更糟糕。

于 2010-08-31T20:43:09.423 回答