Почему я вижу HASH (0xABCDEF) в моем выводе Perl? - PullRequest
2 голосов
/ 02 апреля 2009

Я использую Perl v5.6.1 для Sun4-Solaris-64int

Я вызываю print для массива:

print "@vals\n";

и вывод выглядит так:

HASH(0x229a4) uid cn attuid

или другой пример:

@foo = {};
push(@foo, "c");

print "@foo I am done now\n";

с выводом:

HASH(0x2ece0) c I am done now

Откуда HASH(0x2ece0) откуда?

Ответы [ 4 ]

14 голосов
/ 02 апреля 2009

Ваши фигурные скобки в @foo = {} создают его. Скобки создают неназванную ссылку на хеш.

Если вы хотите установить @foo в пустой список, используйте @foo = ()

6 голосов
/ 02 апреля 2009

Ключом к пониманию проблемы такого рода является то, что вы получаете дополнительный элемент в выводе. Не слишком важно, что это за предмет.

В общем, первое, что вы хотели бы сделать, когда ваша переменная контейнера содержит больше (или меньше), чем вы ожидаете, - это посмотреть на ее содержимое. Модуль Data :: Dumper поставляется с Perl и может напечатать структуры данных для вас:

use Data::Dumper;
print Dumper( \@foo );

Как только вы увидите, что находится в вашем контейнере, вы можете начать работать в обратном направлении, чтобы выяснить, как он туда попал. В конечном итоге вы сразу заметили, что сразу после инициализации @foo в нем уже есть один элемент, а это не то, что вы хотели.

Еще один трюк - проверить количество элементов в списке:

print "There are " . @array . " elements in \@array\n";

Если вы получили число, которого вы не ожидали, вернитесь назад, чтобы узнать, когда появился дополнительный элемент.

4 голосов
/ 02 апреля 2009

У вас случайно есть ссылка на хеш в @foo. Когда вы печатаете ссылку без разыменования (почти всегда случайно), вы получаете строку отладки (тип ссылки и расположение в памяти).

Я думаю, что вы хотите my @foo = (); push @foo, "c";, а не то, что у вас есть сейчас. С другой стороны, вы также можете просто сказать my @foo;, чтобы создать массив. Вам не нужно явно помечать его как пустое с помощью ().

См. perldoc perlreftut и perldoc perlref для получения дополнительной информации.

3 голосов
/ 02 апреля 2009

Ваш код должен быть написан так:

use strict;
use warnings;

my @foo;
push @foo, "c";

print "@foo I am done now\n";

Вам не нужно инициализировать переменные в Perl, если вы хотите иметь пустую переменную. Однако вы должны использовать my для объявления локальной переменной. И вам не нужны скобки вокруг встроенных функций, которые просто добавляют беспорядок.

...