Frage

Ich habe ein Perl-Modul (Module.pm), die eine Anzahl von Variablen initialisiert, während der Ausführung von denen einige Ich mag würde zu importieren ($ VAR2, $ VAR3) in zusätzliche Submodule, dass es geladen werden könnten.

So wie ich bin derzeit Module.pm Einrichtung ist wie folgt:

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

Jedes Modul ist wie folgt aufgebaut:

package Module::SubModule1;

use warnings;
use strict;
use Carp;

use vars qw();

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

Ich möchte die $ VAR2 und $ VAR3 Variablen in jedem der Submodule in der Lage sein zu importieren, ohne sie als $ Module :: VAR2 und $ Module :: VAR3 verweisen zu müssen. Ich bemerkte, dass die anrufende Skript zugreifen kann sowohl die Variablen, die ich in Module.pm in der gewünschten Weise exportiert habe aber SubModule1.pm und SubModule2.pm haben noch die Variablen als von Module.pm zu verweisen.

Ich habe versucht, Aktualisieren jedes Submodul wie folgt was leider nicht funktioniert Ich hatte gehofft:

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

Bitte lassen Sie mich wissen, wie ich erfolgreich $ VAR2 und $ VAR3 von Module.pm in jedes Submodul exportieren. Vielen Dank im Voraus für Ihre Hilfe!

War es hilfreich?

Lösung

In Ihrem Submodule, bist du zu sagen vergessen,

use Module;

? Der Aufruf use Module aus einem anderen Paket (sagen wir Module::Submodule9) wird versuchen, die Module::import Methode auszuführen. Da Sie nicht diese Methode haben, wird es die Exporter::import Methode aufrufen, und das ist, wo die Magie, dass Variablen Exporte Module die in den Module::Submodule9 Namespace passieren wird.


In Ihrem Programm gibt es nur eine Module Namespace und nur eine Instanz der (globalen) Variable $Module::VAR2. Exportieren Aliase auf diese Variable in anderen Namensräumen, so kann die gleiche Variable auf unterschiedliche Weise erreicht werden. Versuchen Sie, diese in einem separaten Skript:

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

Andere Tipps

Nun, es ist die einfache Art und Weise:

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

Im Skript:

#!/usr/bin/perl

use strict;
use warnings;

use M;
use M::S;

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

Aber ich würde abraten. Globale Variablen sind keine gute Praxis, und die gemeinsame Nutzung von globalen Variablen zwischen den Modulen sind noch schlimmer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top