Pergunta

Eu tenho um módulo Perl (o Módulo.pm) que inicializa um número de variáveis, algumas das quais eu gostaria de importar ($VAR2, $VAR3) em outros submódulos que ele pode carregar durante a execução.

A maneira que eu estou actualmente a criação de Módulo.pm é como segue:

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

Cada sub-módulo está estruturado da seguinte forma:

package Module::SubModule1;

use warnings;
use strict;
use Carp;

use vars qw();

sub new {
    my ($package) = @_;
    my $self = {};
    bless ($self, $package);
    return $self;
}

Eu quero ser capaz de importar o $VAR2 e $VAR3 variáveis em cada um dos submódulos sem ter de fazer referência a eles como $Module::VAR2 e $Module::VAR3.Eu notei que o script de chamada é capaz de acessar as variáveis que tenho exportados no Módulo.pm da maneira desejada, mas SubModule1.pm e SubModule2.pm ainda tem para fazer referência a variáveis como sendo do Módulo.pm.

Eu tentei atualizar cada submódulo como se segue que, infelizmente, não funcionou, eu estava esperando:

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

Por favor, deixe-me saber como posso exportar com êxito $VAR2 e $VAR3 a partir de um Módulo.pm em cada sub-módulo.Agradecemos antecipadamente por sua ajuda!

Foi útil?

Solução

Em seu submódulos, você está esquecendo de dizer

use Module;

?Chamar use Module de outro pacote (dizer Module::Submodule9) irá tentar executar o Module::import o método.Desde que você não tenha que método, ele vai chamar o Exporter::import o método, que é onde a mágica que as exportações Moduleas variáveis para a Module::Submodule9 namespace vai acontecer.


Em seu programa há apenas uma Module espaço de nomes e somente uma instância de (global) variável $Module::VAR2.Exportação cria aliases para esta variável em outros espaços, de modo que a mesma variável pode ser acessada em diferentes formas.Tente isso em um script separado:

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

Outras dicas

Também não é o caminho mais fácil:

Em M. pm:

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;

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

No script:

#!/usr/bin/perl

use strict;
use warnings;

use M;
use M::S;

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

Mas eu não aconselharia isso.Variáveis globais não são uma boa prática, e o compartilhamento de variáveis globais entre os módulos é ainda pior.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top