Вопрос

Я использую 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 чтобы объявить локальную переменную.И вам не нужны круглые скобки вокруг встроенных функций, это только добавляет беспорядка.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top