Perl 如何从对象访问哈希
我已经写了一个小类,它只有一些getter和setter方法。这些属性之一是散列Perl 如何从对象访问哈希,perl,oop,Perl,Oop,我已经写了一个小类,它只有一些getter和setter方法。这些属性之一是散列 sub getMyData { my $objekt = shift; return $objekt->{MYDATA}; } sub setMyData { my $objekt = shift; my %myData= shift; $objekt->{MYDATA} = \%myData; } 如果我在访问我的类的另一个SKcript中设置如下值: m
sub getMyData
{
my $objekt = shift;
return $objekt->{MYDATA};
}
sub setMyData
{
my $objekt = shift;
my %myData= shift;
$objekt->{MYDATA} = \%myData;
}
如果我在访问我的类的另一个SKcript中设置如下值:
my %test;
$test{'apple'}='red';
$objekt = MYNAMESPACE::MYCLASS->new;
$objekt->setMyData(%test);
我想我可以通过以下方式轻松访问此值:
my $data = $objekt->getMyData;
print $data{'apple'};
我只得到未定义的值
从转储程序输出:
有人能告诉我这里出了什么问题,以及如何访问getMyData并打印“红色”值吗?您缺少取消引用箭头。因为您将一个hashref\%myData放入,所以您还将得到一个引用
my $data = $objekt->getMyData;
print $data->{'apple'};
# ^
# here
您还需要更改赋值,因为您正在将列表传递给setter,而不是引用。shift表示标量单个值,但%test将转换为多个值的列表
sub setMyData
{
my $objekt = shift;
my %myData = @_;
$objekt->{MYDATA} = \%myData;
}
但是,您的代码还有一些问题。删除并返回数组的第一个元素。在子例程内部,一个空移位操作@uu,它包含传递给该子例程的所有参数的副本
这里真正发生的是setMyData被传递给以下数据:
setMyData($objekt, 'apple', 'red');
setMyData中的第一个移位从@_
setMyData中的第二个移位将删除“apple”,但由于您将此移位的结果分配给一个散列,因此会创建一个如下的散列:“apple”=>undf
获取对该散列的引用,并将其存储在$objekt的MYDATA键中
您真正想要的是将@u的剩余部分分配给您的哈希:
sub setMyData {
my $objekt = shift;
my %myData = @_;
# my ($objekt, %myData) = @_; (alternative)
$objekt->{MYDATA} = \%myData;
}
另一个选项是改为向setMyData发送哈希引用,这将与shift一起工作:
您正在向setMyData发送“苹果”、“红色”。那可能不是你想做的。您可能是指setMyData\%test。但通常在使用对象时,您不会来回传递哈希,而是使用get_data_value'apple'方法。代码中的名称非常可怕。如果德语变量名对您有效,那么德语变量名也可以,但您应该遵循一些最佳实践。在Perl OOP中,对象通常称为$self。所有caps名称(如MYDATA)通常仅用于常量,但很少用于常量。Perl世界更喜欢不使用CamelCase命名变量和函数,而是使用下划线,如set_my_data。除此之外,您应该查看并访问%数据,而不是$数据。严格使用;应该位于代码顶部,以防止使用未声明的变量您仍然缺少->因为getter返回了一个ref.@simbabque我忽略了它,因为您已经解决了它:谢谢。这解决了我的问题。此外,我将把所有变量和方法重命名为perl标准。
sub setMyData {
my $objekt = shift;
my $myData_ref = shift
$objekt->{MYDATA} = $myData_ref;
}
$objekt->setMyData(\%test);