我有一个扩展子模块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的情况下做到这一点?
感谢阅读。 :)
答案 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
引用作为参数传递给方法正确的解决方案取决于您尝试做什么以及如何使用它。