我写了一个小类,它只是得到了一些getter和setter方法。其中一个属性是哈希。
sub getMyData
{
my $objekt = shift;
return $objekt->{MYDATA};
}
sub setMyData
{
my $objekt = shift;
my %myData= shift;
$objekt->{MYDATA} = \%myData;
}
如果我在另一个访问我班级的skript中设置了这样的值:
my %test;
$test{'apple'}='red';
$objekt = MYNAMESPACE::MYCLASS->new;
$objekt->setMyData(%test);
我以为我可以通过以下方式轻松访问此值:
my $data = $objekt->getMyData;
print $data{'apple'};
我只是得到了undef值。
有人可以告诉我这里有什么问题以及我如何访问getMyData并打印值'red'?
答案 0 :(得分:4)
shift
删除并返回数组的第一个元素。在子程序内部,一个裸移位在@_
上运行,它包含传递给该子程序的所有参数的副本。
这里真正发生的是setMyData
正在传递此数据:
setMyData($objekt, 'apple', 'red');
shift
中的第一个setMyData
从$objekt
删除@_
shift
中的第二个setMyData
删除'apple',但由于您将此转换的结果分配给Hash,因此会创建一个如下所示的哈希:'apple' => undef
$objekt
您真正想要的是将@_
的剩余部分分配给您的哈希:
sub setMyData {
my $objekt = shift;
my %myData = @_;
# my ($objekt, %myData) = @_; (alternative)
$objekt->{MYDATA} = \%myData;
}
另一种选择是将散列引用发送到setMyData
,将与shift
一起使用:
sub setMyData {
my $objekt = shift;
my $myData_ref = shift
$objekt->{MYDATA} = $myData_ref;
}
$objekt->setMyData(\%test);
答案 1 :(得分:3)
您缺少取消引用箭头。因为您将hashref(\%myData
)放入其中,您还可以获得引用。
my $data = $objekt->getMyData;
print $data->{'apple'};
# ^
# here
您还需要更改分配,因为您要将列表传递给setter,而不是引用。 shift
用于标量(单个)值,但%test
变为列表(多个值)。
sub setMyData
{
my $objekt = shift;
my %myData = @_;
$objekt->{MYDATA} = \%myData;
}
但是,您的代码还有一些问题。