Question

J'ai un module Perl (Module.pm) qui initialise un certain nombre de variables, dont certaines que je voudrais importer ($ Var2, VAR3 $) en sous-modules supplémentaires qu'il pourrait charger pendant l'exécution.

La façon dont je suis actuellement en place Module.pm la mise est la suivante:

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

Chaque sous-module est structuré comme suit:

package Module::SubModule1;

use warnings;
use strict;
use Carp;

use vars qw();

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

Je veux être en mesure d'importer le $ Var2 et Var3 variables $ dans chacune des sous-modules sans avoir à les référencer comme de $ Module VAR2 et VAR3 :: Module $. J'ai remarqué que le script d'appel est en mesure d'accéder à la fois les variables que j'ai exportés Module.pm de la façon souhaitée, mais SubModule1.pm et SubModule2.pm doivent encore faire référence à des variables comme étant de Module.pm.

J'ai essayé de mettre à jour chaque sous-module comme suit malheureusement ne fonctionnait pas, j'espérais:

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

S'il vous plaît laissez-moi savoir comment je peux exporter avec succès $ et VAR2 $ var3 de Module.pm dans chaque sous-module. Merci d'avance pour votre aide!

Était-ce utile?

La solution

Dans vos sous-modules, êtes-vous Oublier de dire

use Module;

? Appel use Module d'un autre paquet (dire Module::Submodule9) tentera d'exécuter la méthode de Module::import. Puisque vous n'avez pas cette méthode, il appellera la méthode Exporter::import, et c'est là que la magie qui exporte les variables de Module dans l'espace de noms Module::Submodule9 se produira.


Dans votre programme, il n'y a qu'un seul espace de noms Module et une seule instance de la variable (globale) $Module::VAR2. L'exportation crée des alias à cette variable dans d'autres espaces de noms, de sorte que la même variable est accessible de différentes façons. Essayez ceci dans un script séparé:

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

Autres conseils

Eh bien, il y a la manière simple:

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

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;

Dans le script:

#!/usr/bin/perl

use strict;
use warnings;

use M;
use M::S;

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

Mais je conseillerais contre cela. Les variables globales ne sont pas une bonne pratique et le partage des variables globales entre les modules est encore pire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top