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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top