Pregunta

Me postulo Perl, v5.6.1 construido para sun4-solaris-64int

Estoy llamando impresión en una matriz:

print "@vals\n";

y la salida será similar a:

HASH(0x229a4) uid cn attuid

o otro ejemplo:

@foo = {};
push(@foo, "c");

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

con una producción de:

HASH(0x2ece0) c I am done now

Cuando se HASH(0x2ece0) viene?

¿Fue útil?

Solución

Sus apoyos en @foo = {} están creando. Las llaves crean una referencia a un hash sin nombre.

Si desea establecer @foo a una lista vacía, utilice @foo = ()

Otros consejos

La clave para entender este tipo de problema es que se obtiene un elemento adicional en la salida. No es muy importante lo que el tema es.

En general, la primera cosa que te gustaría hacer cuando la variable de contenedor tiene más (o menos) en él de lo que espera es mirar su contenido. El módulo de datos :: Dumper viene con Perl y puede bastante estructuras de datos de impresión para usted:

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

Una vez que vea lo que está en su contenedor, puede empezar a trabajar hacia atrás para averiguar cómo llegó hasta allí. Es muy probable que terminarías notar que justo después de inicializado @foo que ya tenía un elemento, que no es lo que quería.

Otro truco es comprobar el número de elementos en la lista:

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

Si se obtiene un número que no esperas, trabajar hacia atrás para averiguar cuando el elemento extra apareció.

De forma accidental, tiene una referencia a un hash en @foo. Al imprimir una referencia a cabo sin la eliminación de referencias que (casi siempre por accidente), se obtiene una cadena de depuración (el tipo de referencia que es y una posición de memoria).

Creo que quieres my @foo = (); push @foo, "c"; en lugar de lo que tiene ahora. Por otro lado, también puede simplemente decir my @foo; para crear la matriz. No es necesario para marcar explícitamente como vacío con ().

perldoc perlreftut y perldoc perlref para más información sobre referencias.

El código debe escribirse así:

use strict;
use warnings;

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

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

No es necesario para inicializar las variables en Perl, si usted quiere tener una variable vacía. Sin embargo, deberá utilizar my para declarar una variable local. Y no es necesario paréntesis en torno a las funciones incorporadas, que sólo se suma el desorden.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top