Question

Je suis en cours d'exécution perl, v5.6.1 construit pour sun4-solaris-64int

Je fais appel impression sur un tableau:

print "@vals\n";

et la sortie ressemble à:

HASH(0x229a4) uid cn attuid

ou un autre exemple:

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

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

avec une production de:

HASH(0x2ece0) c I am done now

HASH(0x2ece0) vient?

Était-ce utile?

La solution

Vos accolades dans @foo = {} la créent. Les entretoises créer une référence de hachage anonyme.

Si vous souhaitez définir @foo à une liste vide, utilisez @foo = ()

Autres conseils

La clé pour comprendre ce genre de problème est que vous obtenez un élément supplémentaire dans la sortie. Il est important de ne pas trop ce que cet élément est.

En général, la première chose que vous voulez faire lorsque votre variable conteneur a plus (ou moins) dans ce que vous attendez est de regarder son contenu. Le module Data :: Dumper est livré avec Perl et peut à peu les structures de données d'impression pour vous:

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

Une fois que vous voyez ce qui est dans votre conteneur, vous pouvez commencer à travailler en arrière pour savoir comment il est arrivé là-bas. Vous souhaitez éventuellement finir par remarquer ce droit après avoir initialisé @foo qu'il avait déjà un élément, ce qui est pas ce que vous vouliez.

Une autre astuce consiste à vérifier le nombre d'éléments dans la liste:

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

Si vous obtenez un numéro que vous ne vous attendez pas, travailler en arrière pour savoir quand l'élément supplémentaire est apparu.

Vous avez accidentellement une référence de hachage dans @foo. Lorsque vous imprimez une référence sans déréférencement il (presque toujours par hasard), vous obtenez une chaîne de débogage (le type de référence, il est et un emplacement de mémoire).

Je pense que vous voulez my @foo = (); push @foo, "c"; plutôt que ce que vous avez maintenant. D'autre part, vous pouvez aussi dire simplement my @foo; pour créer le tableau. Vous n'avez pas besoin de marquer explicitement comme vide avec ().

Voir perldoc perlreftut et perldoc perlref pour en savoir plus sur les références.

Votre code doit être écrit comme ceci:

use strict;
use warnings;

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

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

Vous n'avez pas besoin d'initialiser les variables en Perl, si vous voulez avoir une variable vide. Vous devez toutefois utiliser my de déclarer une variable locale. Et vous n'avez pas besoin de parenthèses autour de fonctions intégrées, qui ajoute juste du désordre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top