2011-08-04 24 views
-1

サブモジュールbarとbazを拡張したモジュールfooがあります。私はbarとbazがfooにある同じセットのハッシュを変更したいと思っています。複数のサブモジュール間で変数を共有する

今私のようなものがあります:サブモジュールの1つのコンストラクタ内部

my $foo = new foo; 
my $bar = new foo::bar($foo); 
$bar->doStuff(); 
$bar->printSelf(); 
my $baz = new foo::bar($foo); 
$baz->doOtherStuff(); 
$baz->printSelf(); 

は、次のようになります。

sub new { 
    my $class = shift; 
    my $self = shift; 
    --stuff-- 
    bless $self, $class; 
    return $self; 
} 

あまりにもハード笑っていないしてください。 $ fooを渡さずにこれを行う方法はありますか?

読んでいただきありがとうございます。 :)

+0

どのような "ハッシュのセット"?表示されているコードにハッシュはありません... – tadmc

答えて

2

私はメソッドを通して物事を共有する方が好きです。そうすれば、誰もが(あなたがメソッドの名前を知っておく必要がありますが)データ構造や変数名について何も知らなければならない:

{ 
package SomeParent; 

my %hash1 =(); 
my %hash2 =(); 

sub get_hash1 { \%hash1 } 
sub get_hash2 { \%hash2 } 

sub set_hash1_value { ... } 
sub set_hash1_value { ... } 
} 

SomeParentはプライベートデータ構造で取得するためのインタフェースを提供するので、それは何ですあなたはSomeChildで使用します:

{ 
package SomeChild; 
use parent 'SomeParent'; 

sub some_method { 
     my $self = shift; 
     my $hash = $self->get_hash1; 
     ...; 
     } 

sub some_other_method { 
     my $self = shift; 
     $self->set_hash2_value('foo', 'bar'); 
     } 

} 
0

あなたの質問はあまり明確ではないし、ハッシュコードもありません。しかし、あなたは変数が変更されモジュールが必要な場合は、完全修飾名を使用することができます

package Foo;  # don't use lowercase named, they are reserved for pragmas 

our %hash1 =(); 
our %hash2 =(); 


package Foo::Bar; 
use Data::Dump qw(dd); 

sub do_stuff { 
    $Foo::hash1{new_item} = 'thing'; 
} 

sub do_other_stuff { 
    dd \%Foo::hash1; 
} 


package main; 

Foo::Bar->do_stuff(); 
Foo::Bar->do_other_stuff(); 

をしかし、あなたはインスタンス変数を変更する必要がある場合は、このインスタンスへの参照を持っている必要があります。ハッシュはコンストラクタでFooFoo::Bar

  • パス参照のインスタンスになるとプロパティとして保存されますのでとしてFoo::Bar
  • パスFoo参照して、Fooから

    • 継承:私は仕事といくつかの戦略を見ますパラメータをメソッド

    適切な解決策は、あなたがしようとしていること、およびその使用方法によって異なります。

  • 関連する問題