Совместное использование переменных между несколькими подмодулями - PullRequest
0 голосов
/ 05 августа 2011

У меня есть модуль 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 ]

2 голосов
/ 05 августа 2011

Я предпочитаю делиться вещами через методы.Таким образом, никто не должен ничего знать о структурах данных или именах переменных (хотя вам нужно знать имя метода):

 {
 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 голосов
/ 05 августа 2011

Ваш вопрос не очень понятен, и нет кода с хэшами. Но если вам нужно изменить module переменные, вы можете использовать полное имя:

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 ссылка в качестве параметра на метод

Правильное решение зависит от того, что вы пытаетесь сделать и как вы собираетесь его использовать.

...