Perl горе - назначение и возврат хэшей - PullRequest
2 голосов
/ 09 ноября 2010

У меня есть переменная экземпляра, свойства, которая объявляется и создается как:пара ключ-значение.

Я пытаюсь написать геттер для переменной экземпляра свойств, который вернет хеш:

sub getProperties{
    my $self = shift;

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

, а затем вызовет геттер так:

my %properties = $properties->getProperties();

Когда я пытаюсь скомпилировать это, я получаю:

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

line 70 being:    my %myhash = $self->{properties}; 

Ответы [ 2 ]

7 голосов
/ 09 ноября 2010

В этой строке кода:

my %myhash = $self->{properties};

% myhash - это хеш, тогда как $ self -> {properties} - это хеш ссылка . Таким образом, вы фактически возвращаете хеш с одной парой ключ / значение, где ключ является ссылкой на хеш, а значение равно undef.

Если вы действительно хотите вернуть хеш, сделайте следующее:

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'};
2 голосов
/ 09 ноября 2010

не $self->{properties} хэшфр не хеш?

$ perl t4.pl
size -> 42

t4.pl

#!/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";
}

t4.pm

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...