Почему я вижу ХЭШ (0xABCDEF) в моем выводе Perl?
-
22-08-2019 - |
Вопрос
Я использую perl версии 5.6.1, созданный для sun4-solaris-64int
Я вызываю печать в массиве:
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)
откуда исходит?
Решение
Ваши фигурные скобки в @foo = {} создают это.Фигурные скобки создают безымянную ссылку на хэш.
Если вы хотите установить @foo в пустой список, используйте @foo = ()
Другие советы
Ключом к пониманию такого рода проблем является то, что вы получаете дополнительный элемент в выходных данных.Не слишком важно, что это за предмет.
В общем, первое, что вы хотели бы сделать, когда в вашей переменной контейнера содержится больше (или меньше), чем вы ожидаете, - это посмотреть на ее содержимое.Модуль Data::Dumper поставляется с Perl и может в значительной степени печатать структуры данных для вас:
use Data::Dumper;
print Dumper( \@foo );
Как только вы увидите, что находится в вашем контейнере, вы можете начать работать в обратном направлении, чтобы выяснить, как это туда попало.В конечном итоге вы бы заметили, что сразу после инициализации @foo в нем уже был один элемент, а это не то, что вы хотели.
Другой трюк заключается в проверке количества элементов в списке:
print "There are " . @array . " elements in \@array\n";
Если вы получите число, которого не ожидаете, вернитесь назад, чтобы выяснить, когда появился дополнительный элемент.
У вас случайно есть ссылка на хэш в @foo.Когда вы печатаете ссылку, не разыменовывая ее (почти всегда случайно), вы получаете отладочную строку (тип ссылки и ячейку памяти).
Я думаю, ты хочешь my @foo = (); push @foo, "c";
а не то, что у вас есть сейчас.С другой стороны, вы также можете просто сказать my @foo;
чтобы создать массив.Вам не нужно явно отмечать его как пустой с помощью ()
.
Видишь perldoc perlreftut
и perldoc perlref
подробнее о ссылках.
Ваш код должен быть написан следующим образом:
use strict;
use warnings;
my @foo;
push @foo, "c";
print "@foo I am done now\n";
Вам не нужно инициализировать переменные в Perl, если вы хотите иметь пустую переменную.Однако вам следует использовать my
чтобы объявить локальную переменную.И вам не нужны круглые скобки вокруг встроенных функций, это только добавляет беспорядка.