2009-04-02 4 views
2

Я бегу PERL, v5.6.1 построен для sun4-соляриса-64intПочему я вижу HASH (0xABCDEF) в своем выходе Perl?

Я звоню печать на массив:

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)?

ответ

14

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

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

4

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

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

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

3

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

use strict; 
use warnings; 

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

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

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

6

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

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

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

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

Еще одна уловка, чтобы проверить количество элементов в списке:

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

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