Hash in einem Array.

P

Phill

Jungspund
Hallo Leute,

ich bin mir sicher das Thema ist schon einige mal diskutiert worden, hab mir auch schon einiges durchgelesen aber ich bin kurz vorm verzweifeln!?!?!

Also ganz einfach: :)

Ich füttere in einer function einen Array (@t) mit einem hash (%tinfo) ...

Code:
foreach (@elements) {
%tinfo = tSplit($_); # die funktion gibt einen Hash zurück
if (%tinfo) { push(@t, \%tinfo) } #wenn vorhanden dann pushen

if (%tinfo) { print $tinfo{no}." " } # nur test ob der hash auch funktioniert... (tut er auch)

}
return(@t);
}
so und nun in der anderen function die den return wert bekommt.

Code:
foreach (@t) {
print $_{no}."\n";
}
so das gibt folgendes
Use of uninitialized value in concatenation (.) or string
wenn ich in der letzten schleife direkt print $_ eingebe gibt er mir HASH(0x82cc240) aus. Also muss er doch den Hash enthalten..

kann mir einer sagen was ich falsch mache?? Wäre sehr dankbar.
Gruß
 
Ich geh jetzt mal nicht auf deinen Code ein, sondern erkläre das, was du imho nicht verstanden hast:
Arrays können nur Skalare "enthalten", du kannst also nur hash-Referenzen und keinen hashes in arrays packen. (Was du ja auch machst.)
Die musst du dann natürlich auch wieder dereferenzieren:
Code:
my @bla = ({foo => 'bar', omg => 'lol'}, "arrayElement", 3.14);
print "$bla[0]{foo}\n" # gibt "bar" aus
$bla[0]{foo} ist dasselbe wie $bla[0]->{foo}.
{foo => 'bar'} ist eine anonyme Referenz auf das hash (foo => 'bar').
Siehe auch hier und hier.
Wenn ich was verpennt haben sollte und das Problem ganz wo anders liegt: man mache mich bitte drauf aufmerksam.
 
also ich glaube das dereferenzieren ist gar nicht mein problem.
Mein Problem scheint an folgenden zeilen zu hängen:

Code:
	foreach (@timers) {
		%tinfo = timerSplit($_);
		if (%tinfo) {
		push(@t, \%tinfo);
		print $t[0]{no}."\n";
		}
	}
kann mir einer erklären wie es sein kann das der print mir bei jedem durchlauf der schleife einen anderen wert anzeigt???
Der müsste doch jedes mal den 0ten Array anzeigen und der sollte sich doch durch einen push nicht verändern? macht er aber, es wird jedesmal das selbe wie $tinfo{no} ausgegeben?!?!
 
Zuletzt bearbeitet:
Hättest du use strict benutzt, wäre dir das nicht passiert...
use warnings ist auch zu empfehlen...
Einfach das hash in dem inneren Block mit my deklarieren und die Probleme sollten sich in Luft auflösen.

Warum das jetzt genau passiert ist, weiß ich auch nicht 100%tig. Also erstmal enthält dein Array dann nur Referenzen auf ein einziges Hash. Und dieses Hash, welches im Array referenziert wird, wird scheinbar mit dem Aufruf "%tinfo = timerSplit($_)" in place verändert; also es wird kein neues Hash erzeugt, sondern immer dasselbe verändert. Also einfach immer my verwenden, wenn du nicht ganz genau weißt, was du tust...
 
Zuletzt bearbeitet:

Ähnliche Themen

NagiosGrapher 1.7.1 funktioniert nicht

Programme im PATH durch eigene Binaries ersetzen

web-cyradm: Anmeldung nicht möglich

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

ordner auf änderungen überwachen

Zurück
Oben