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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top