在多个子模块之间共享变量

时间:2011-08-04 23:45:06

标签: perl perl-module

我有一个扩展子模块bar和baz的模块foo。我希望bar和baz修改foo中的同一组哈希。

现在我有类似的东西:

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的情况下做到这一点?

感谢阅读。 :)

2 个答案:

答案 0 :(得分: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' );
      }

 }

答案 1 :(得分: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();

但是如果您需要修改实例变量,则需要引用此实例。我看到一些可行的策略:

  • 继承自Foo,因此哈希将在Foo::Bar
  • 的实例中
  • 在构造函数中将引用传递给Foo,并将其存储为Foo::Bar
  • 中的属性
  • Foo引用作为参数传递给方法

正确的解决方案取决于您尝试做什么以及如何使用它。