質問

私はそれが実行時にロードするかもしれないと追加のサブモジュールにインポート($ VAR2、$ VAR3)したいのですが、そのいくつかの変数の数を、初期化するPerlモジュール(Module.pm)を持っています。

次のように

私は現在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 $変数をインポートできるようにしたい:: VAR2と$モジュール:: 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;
}

私は成功し、各サブモジュールにModule.pmから$ VAR2とVAR3 $をエクスポートする方法を教えてください。あなたの助けを事前に感謝!

役に立ちましたか?

解決

あなたのサブモジュールでは、あなたが言うことを忘れている。

use Module;

?別のパッケージ(たとえばのuse Module)からModule::Submodule9を呼び出すと、Module::importメソッドを実行しようとします。あなたはその方法を持っていないので、それはExporter::importメソッドを呼び出します、それはModule名前空間への輸出のModule::Submodule9の変数が起こることをどこ魔法です。

<時間>

あなたのプログラムでは唯一のModule名前空間と(グローバル)変数$Module::VAR2のインスタンスは1つだけです。エクスポート他の名前空間でこの変数にエイリアスを作成するため、同じ変数は、様々な方法でアクセスすることができます。別のスクリプトでこれを試してください:

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

他のヒント

まあ簡単な方法があります:

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();

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top