Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 - Fatal编程技术网

Perl难题-分配和返回哈希

Perl难题-分配和返回哈希,perl,Perl,我有一个实例变量properties,它被声明和实例化如下: $self->{properties}{$key1} = $value; 我的理解是,这将声明properties字段,并将其设置为哈希原语,其中包含一个键值对 我正在尝试为properties实例变量编写一个getter,它将返回哈希: sub getProperties{ my $self = shift; my %myhash = $self->{properties}; return

我有一个实例变量properties,它被声明和实例化如下:

 $self->{properties}{$key1} = $value;
我的理解是,这将声明properties字段,并将其设置为哈希原语,其中包含一个键值对

我正在尝试为properties实例变量编写一个getter,它将返回哈希:

sub getProperties{
    my $self = shift;

    my %myhash = $self->{properties}; 
    return %myhash;
}
然后像这样称呼getter:

my %properties = $properties->getProperties();
当我尝试编译此文件时,我得到:

"Odd number of elements in hash assignment at 70..."

line 70 being:    my %myhash = $self->{properties}; 
在这一行代码中:

my %myhash = $self->{properties};
%myhash是一个哈希,而$self->{properties}是一个哈希引用。因此,实际上是返回一个具有一个键/值对的散列,其中键是对散列的引用,而值是未定义的

如果确实要返回哈希,请执行以下操作:

my %myhash = %{$self->{properties}};
或者,返回散列引用。这通常比返回散列更可取,因为它不会复制原始散列,因此随着散列变大,内存效率会提高。下面是它的外观:

sub getProperties {
    my $self = shift;
    return $self->{properties};
}
然后在您的呼叫代码中,而不是此代码中:

my %properties = $properties->getProperties();
$somevalue = $properties{'somekey'};
这样做:

# getProperties returns a reference, so assign to a scalar
# variable ($foo) rather than a hash (%foo)
my $properties = $properties->getProperties();

# Use -> notation to dereference the hash reference
$somevalue = $properties->{'somekey'};

$self->{properties}
不是散列吗

$ perl t4.pl
size -> 42
t4.pl

下午4:00


Simon如果我像你说的那样返回一个散列引用-我以后可以通过这样做得到一个散列引用吗?我的%associations=%{$properties->getProperties()};这段代码很好,它会给你一个散列(我想这就是你的意思:)。
#!/usr/bin.perl
use strict;
use warnings;

use t4;

my $t4 = t4->new();
my %hash = $t4->getProperties();
for my $key (keys %hash) {
  print "$key -> $hash{$key}\n";
}
package t4;

sub new {
  my $class = shift;
  my $self = {};
  $self->{properties}{size} = 42;
  bless ($self, $class);
}

sub getProperties {
  my $self = shift;
  my %myhash = %{$self->{properties}};
  return %myhash;
}

1;