Por que eu vejo HASH (0xABCDEF) na minha saída Perl?
-
22-08-2019 - |
Pergunta
Estou executando perl, v5.6.1 construído para sun4-solaris-64int
Eu estou chamando de impressão em um array:
print "@vals\n";
e os olhares de saída como:
HASH(0x229a4) uid cn attuid
ou outro exemplo:
@foo = {};
push(@foo, "c");
print "@foo I am done now\n";
com saída de:
HASH(0x2ece0) c I am done now
Onde está HASH(0x2ece0)
vindo?
Solução
As suas chaves em @foo = {} estão criando. As chaves criar uma referência de hash sem nome.
Se você quiser set @foo para uma lista vazia, o uso @foo = ()
Outras dicas
A chave para entender este tipo de problema é que você obter um item extra na saída. Não é muito importante que esse item é.
Em geral, a primeira coisa que você quer fazer quando sua variável recipiente tem mais (ou menos) nele do que você espera é olhar para o seu conteúdo. O módulo Data :: Dumper vem com Perl e pode muito imprimir estruturas de dados para você:
use Data::Dumper;
print Dumper( \@foo );
Uma vez que você ver o que está em seu recipiente, você pode começar a trabalhar para trás para descobrir como ele chegou lá. Você teria, eventualmente, acabam percebendo que logo após você inicializado @foo que já tinha um elemento, o que não é o que você queria.
Outro truque é verificar o número de elementos da lista:
print "There are " . @array . " elements in \@array\n";
Se você recebe um número que você não espera, o trabalho para trás para saber quando o elemento extra apareceu.
Você acidentalmente ter uma referência hash em @foo. Quando você imprime uma referência sem dereferencing-lo (quase sempre por acidente), você tem uma string de depuração (o tipo de referência que é e um local de memória).
Eu acho que você quer my @foo = (); push @foo, "c";
e não o que você tem agora. Por outro lado, você também pode simplesmente dizer my @foo;
para criar a matriz. Você não precisa explicitamente marcá-lo como vazio com ()
.
perldoc perlreftut
e perldoc perlref
para saber mais sobre as referências.
O código deve ser escrito assim:
use strict;
use warnings;
my @foo;
push @foo, "c";
print "@foo I am done now\n";
Você não precisa inicializar variáveis ??em Perl, se você quer ter uma variável vazia. no entanto você deve usar my
para declarar uma variável local. E você não precisa de parênteses em torno de built-in funções, que apenas acrescenta confusão.