Frage

Ich perl leite, v5.6.1 gebaut für sun4-solaris-64int

Ich rufe Druck auf einem Array:

print "@vals\n";

und die Ausgabe wie folgt aussieht:

HASH(0x229a4) uid cn attuid

oder ein anderes Beispiel:

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

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

mit einer Leistung von:

HASH(0x2ece0) c I am done now

Wo ist HASH(0x2ece0) kommen aus?

War es hilfreich?

Lösung

Ihre Zahnspange in @foo = {} es schaffen. Die Streben schaffen einen ungenannten Hashreferenz.

Wenn Sie @foo auf eine leere Liste setzen möchten, verwenden Sie @foo = ()

Andere Tipps

Der Schlüssel, um diese Art von Problem zu verstehen ist, dass Sie ein zusätzliches Element in der Ausgabe erhalten. Es ist nicht so wichtig, was das Produkt ist.

Im Allgemeinen ist das erste, was Sie tun wollen würden, wenn der Behälter mit variabler mehr (oder weniger) hat in ihm, als Sie erwarten ist, zu betrachten, es ist Inhalt. Die Data :: Dumper-Modul kommt mit Perl und kann ziemlich Druckdatenstrukturen für Sie:

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

Wenn Sie sehen, was in Ihrem Container ist, können Sie beginnen, rückwärts zu arbeiten, um herauszufinden, wie es da drin. Sie würden schließlich zu bemerken, dass am Ende rechts, nachdem Sie initialisiert @foo, dass es bereits ein Element hatte, das ist nicht das, was Sie wollten.

Ein weiterer Trick ist es, die Anzahl der Elemente in der Liste zu überprüfen:

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

Wenn Sie eine Nummer bekommen Sie nicht erwarten, nach hinten arbeiten, um herauszufinden, wenn das zusätzliche Element auftaucht.

Sie versehentlich eine Hashreferenz in @foo haben. Wenn Sie eine Referenz auszudrucken, ohne es zu dereferencing (fast immer durch Zufall), können Sie ein Debug-String erhalten (die Art der Referenz ist und ein Speicherplatz).

Ich glaube, Sie wollen my @foo = (); push @foo, "c"; eher als das, was Sie jetzt haben. Auf der anderen Seite können Sie auch einfach sagen my @foo; das Array zu erstellen. Sie müssen nicht explizit als leer markieren mit ().

Siehe perldoc perlreftut und perldoc perlref mehr auf Referenzen.

Der Code sollte wie folgt geschrieben werden:

use strict;
use warnings;

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

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

Sie müssen keine Variablen in Perl initialisieren, wenn Sie eine leere Variable haben wollen. Sie sollten jedoch my eine lokale Variable deklarieren. Und Sie brauchen keine Klammern brauchen um integrierte Funktionen, das nur Krempel hinzufügt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top