J'ai un module Perl (Module.pm) qui initialise un certain nombre de variables, dont certaines que je voudrais importer ($ VAR2, $ VAR3) dans des sous-modules supplémentaires qu'il pourrait charger pendant exécution.Perl Importer des variables à partir du module d'appel
La façon dont je suis actuellement en place Module.pm la mise en est comme suit:
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 variables $ VAR3 dans chacun des sous-modules sans avoir à les référencer comme $ Module :: VAR2 et $ Module :: VAR3. J'ai remarqué que le script appelant est capable d'accéder aux deux variables que j'ai exportées dans Module.pm de la manière désirée mais SubModule1.pm et SubModule2.pm doivent toujours faire référence aux variables comme provenant de Module.pm.
J'ai essayé de mettre à jour chaque sous-module comme suit qui ne fonctionne malheureusement 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!
règle - Je pensais que cela créerait une situation d'instance multiple puisque je veux seulement 1 instance de Module.pm en cours d'exécution et partage ses variables GLOBAL à travers SubModule1.pm et SubModule2.pm si fondamentalement si une fonction dans SubModule1.pm modifie $ VAR2 alors cette modification serait accessible à travers Module.pm et les autres sous-modules. Serait l'ajout de «utiliser le module; comme vous avez suggéré dans les sous-modules de créer cet effet désiré? Sinon, comment pourrait-il être accompli autrement? –
Oui, cela aurait l'effet escompté, mais si l'effet que vous voulez obtenir est de baser le comportement des globales dans un paquet arbitrairement modifié par un autre, vous feriez bien de repenser sérieusement votre conception. – friedo
@friedo - J'aimerais avoir des conseils sur les façons dont nous pourrions envisager de modifier le design puisque je sais que ce n'est pas idéal pour utiliser ou changer GLOBALS. La raison pour laquelle je veux que ces variables soient globales est parce que Module.pm agit en tant que notre contrôleur et met en place un tas de variables GLOBAL comme l'URL de notre domaine, l'emplacement du répertoire de données, etc. Puisque Module.pm est alors en train de charger quels que soient les sous-modules dont il a besoin pour rendre la page appropriée, je voudrais que tous les sous-modules puissent référencer, utiliser et, dans quelques circonstances particulières, modifier ces variables globales. Y a-t-il une autre façon plus idéale de mettre cela en place? –