Итерация по A Perl Hash распечатывает адрес памяти - PullRequest
1 голос
/ 23 февраля 2011

Следующая подпрограмма используется для итерации по массиву узлов (каждый с континентом в своем хэше) и возврата списка всех стран:

sub getContinentsServed{
    my $self = shift;
    my $temp = $self->{cityListRef};
    my %hash = {};
    my $h_ref = \%hash;
    foreach my $cont (@{$temp}){
        $h_ref->{$cont->{continent}} = '1';
    }
    print "Continents Served: ";
    foreach my $coord (keys %hash){
        print $coord;
        print " , ";
    }
} 

Я вполне уверен, что это содержитвсе правильные данные, но когда я пытаюсь напечатать значения, я получаю это в качестве результата:

Continents Served: Australia Europe North America South America Asia Africa HASH(0x100949a70) 

Кто-нибудь знает, почему я получу этот последний элемент HASH(0x1009...).Я бы предпочел, чтобы это не появлялось, но все, что я делаю, это перебираю ключи, поэтому я не уверен, почему или как это могло бы быть.

Ответы [ 3 ]

8 голосов
/ 23 февраля 2011
my %hash = {};

Это плохо и неправильно.Это настройка %hash, содержащая запись, где ключом является строковое значение {} (хеш-ссылка, поэтому в качестве строки оно будет HASH(0xblahblah)), а значение равно undef.

Все, что вам действительно нужно было написать, было my %hash; (или my %hash = ();, но это уже подразумевалось, поэтому писать его не нужно).Или вы можете сделать my $h_ref; и вообще никогда не использовать %hash (инициализация на {} все еще не нужна из-за автовивификации).

Если бы вы включили use warnings, вы бы по крайней мере получили«нечетное количество элементов в хэше» или «ссылка найдена там, где ожидается список четных размеров» (в зависимости от возраста вашего perl), предупреждающий в этой строке, чтобы дать вам подсказку, что что-то там не так.

3 голосов
/ 23 февраля 2011

Последний $cont->{continent} имеет хеш-ссылку в качестве значения.

Удаление ненужного перенаправления и неправильного использования хеша:

use List::MoreUtils 'uniq';

sub getContinentsServed {  # get_continents_served is more preferred
    my $self = shift;

    print
      'Continents Served: ',
      join ', ', map { $_->{'continent'} } uniq @{ $self->{'cityListRef'} };

    return;
}
1 голос
/ 23 февраля 2011

@{$temp} где $temp = $self->{cityListRef} почти наверняка имеет хэш в качестве последнего члена.

Обновление: я не прав, а Алан Хаггай Алави прав. Это ->{continent} на последнем члене, который является хешем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...