Perché vedo HASH (0xABCDEF) nella mia uscita Perl?
-
22-08-2019 - |
Domanda
Sono in esecuzione perl, v5.6.1 costruita per sun4-solaris-64int
Chiedo di stampa su un array:
print "@vals\n";
e l'output appare come:
HASH(0x229a4) uid cn attuid
o un altro esempio:
@foo = {};
push(@foo, "c");
print "@foo I am done now\n";
con produzione di:
HASH(0x2ece0) c I am done now
Quando è venuta da HASH(0x2ece0)
?
Soluzione
I tuoi bretelle in @pippo = {} stanno creando esso. Le parentesi graffe creano un riferimento ad un hash anonimo.
Se si desidera impostare @pippo ad una lista vuota, utilizzare @pippo = ()
Altri suggerimenti
La chiave per comprendere questo tipo di problema è che si ottiene un elemento in più in uscita. Non è troppo importante ciò che tale elemento è.
In generale, la prima cosa che ci si vuole fare quando la variabile contenitore ha più (o meno) in esso che ci si aspetta è quello di esaminare il suo contenuto. Il modulo Data :: Dumper è dotato di Perl e può tranquillamente strutture di dati di stampa per voi:
use Data::Dumper;
print Dumper( \@foo );
Una volta che si vede ciò che è nel vostro contenitore, è possibile iniziare a lavorare a ritroso per scoprire come sia arrivato lì. Faresti alla fine finisce per notare che subito dopo aver inizializzato @pippo che già aveva un elemento, che non è quello che si voleva.
Un altro trucco è quello di verificare il numero di elementi nella lista:
print "There are " . @array . " elements in \@array\n";
Se si ottiene un numero che non ti aspetti, lavorare a ritroso per scoprire quando l'elemento in più si presentò.
Hai per caso un riferimento hash in @foo. Quando si stampa un riferimento senza dereferenziazione è (quasi sempre per caso), si ottiene una stringa di debug (il tipo di riferimento è e una posizione di memoria).
Penso che si desidera my @foo = (); push @foo, "c";
piuttosto che quello che hai ora. D'altra parte, si può anche semplicemente dire my @foo;
per creare l'array. Non è necessario contrassegnare in modo esplicito come vuota con ()
.
perldoc perlreftut
e perldoc perlref
per maggiori informazioni su riferimenti.
Il codice dovrebbe essere scritto in questo modo:
use strict;
use warnings;
my @foo;
push @foo, "c";
print "@foo I am done now\n";
Non è necessario per inizializzare le variabili in Perl, se si vuole avere una variabile vuota. Tuttavia si dovrebbe usare my
per dichiarare una variabile locale. E non avete bisogno di parentesi che racchiudono funzioni built-in, che appena aggiunge l'ingombro.