Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从对象访问哈希_Perl_Oop - Fatal编程技术网

Perl 如何从对象访问哈希

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

我已经写了一个小类,它只有一些getter和setter方法。这些属性之一是散列

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