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

$VAR2と$VAR3をModule.pmから各サブモジュールに正常にエクスポートする方法を教えてください。よろしくお願いします!

4

2 に答える 2

5

あなたのサブモジュールで、あなたは言うのを忘れていますか

use Module;

use Module別のパッケージ(たとえば)から呼び出すと、メソッドModule::Submodule9が実行されます。Module::importそのメソッドがないため、メソッドが呼び出され、そこで変数を名前空間にExporter::importエクスポートする魔法が発生します。ModuleModule::Submodule9


プログラムには、Module名前空間と(グローバル)変数のインスタンスが1つだけあります$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

簡単な方法があります。

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;

スクリプト内:

#!/usr/bin/perl

use strict;
use warnings;

use M;
use M::S;

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

しかし、私はこれに反対することをお勧めします。グローバル変数は良い習慣ではなく、モジュール間でグローバル変数を共有することはさらに悪いことです。

于 2010-08-31T20:43:09.423 に答える