如何从对象访问哈希

时间:2016-07-21 15:05:21

标签: perl oop

我写了一个小类,它只是得到了一些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值。

自卸车的输出: enter image description here

有人可以告诉我这里有什么问题以及我如何访问getMyData并打印值'red'?

2 个答案:

答案 0 :(得分:4)

shift删除并返回数组的第一个元素。在子程序内部,一个裸移位在@_上运行,它包含传递给该子程序的所有参数的副本。

这里真正发生的是setMyData正在传递此数据:

setMyData($objekt, 'apple', 'red');
  1. shift中的第一个setMyData$objekt删除@_
  2. shift中的第二个setMyData删除'apple',但由于您将此转换的结果分配给Hash,因此会创建一个如下所示的哈希:'apple' => undef
  3. 您引用此哈希并将其存储在$objekt
  4. 的MYDATA键中

    您真正想要的是将@_的剩余部分分配给您的哈希:

    sub setMyData {
        my $objekt = shift;
        my %myData = @_;
        # my ($objekt, %myData) = @_; (alternative)
    
        $objekt->{MYDATA} = \%myData;
    }
    

    另一种选择是将散列引用发送到setMyDatashift一起使用:

    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;
}

但是,您的代码还有一些问题。