Problem mit Referenzierung
Cruz
- perl
0 Klaus Mock0 Cruz
Hallo Perl Freaks,
ich versuche schon seit über einer Stunde diese Referenzierung hinzukriegen und ich kriege einfach nicht raus wieso es nicht funktioniert.
$x = 0;
$y = 0;
while ( ($image{image_id}, $image{image_title}) = $select->fetchrow() )
{
$image_grid->[$x][$y] = %image; # hier wird ein multidimensionaler array von hash referenzen aufgebaut
print $image_grid->[0][0]{image_id}; # hier gibt er den wert richtig aus
$x++;
}
print $image_grid->[0][0]{image_id}; # hier nicht mehr
Wiesoo?????
Gruß,
Cruz
Hallo,
$image_grid->[$x][$y] = %image; # hier wird ein multidimensionaler array von hash referenzen aufgebaut
Zuerst frage ich mich warum $image_grid->[$x][$y] und nicht $image_grid[$x][$y]. Aber das kann durchaus seine Gründe haben.
Allerdings speicherst Du in allen Arrayelemente eine Referenz auf das gleiche Hash, womit beim dereferenzieren alle das gleiche Ergebnis haben. Es kann durchaus sein, daß Du es so willst, was ich aber nicht annehme.
Willst Du verschiedene Werte abspeichern, dnan verwende
$image_grid->[$x][$y] = {%image};
print $image_grid->[0][0]{image_id}; # hier gibt er den wert richtig aus
Hmm, was ist wohl der richtige Wert?
print $image_grid->[0][0]{image_id}; # hier nicht mehr
Und was ist dann der falsche?
Grüße
Klaus
PS.: Warum das so ist, findest Du nach intensivem Studiom von
perldoc perlreftut
perldoc perlref
perldoc perllol
perldoc perldsc
heraus. Normalerweise sollte man diese Dokumenationen auf der Platte finden, zur Not auch unter http://www.perldoc.com;-)
Hi Klaus,
Zuerst frage ich mich warum $image_grid->[$x][$y] und nicht $image_grid[$x][$y]. Aber das kann durchaus seine Gründe haben.
Hat keine Gründe, du hast Recht man kann sich den Pfeil da sparen. :)
Allerdings speicherst Du in allen Arrayelemente eine Referenz auf das gleiche Hash, womit beim dereferenzieren alle das gleiche Ergebnis haben. Es kann durchaus sein, daß Du es so willst, was ich aber nicht annehme.
Auch hier hast du recht das wäre nicht so gewollt gewesen. Ich bin gar nicht erst dazu gekommen das zu sehen, weil ich nach dem Beenden der while fetchrow Schleife
print $image_grid->[0][0]{image_id}; # hier nicht mehr
das hier ausgegeben hab. Es war immer leer. Daher dachte ich meine Referenzen funktionieren nicht. Aber der Grund liegt in dem was du gesagt hast, alle Referenzen zeigen auf den gleichen Hash, nämlich dem letzten, der beim letzten fetchrow Aufruf leer wird.
Jetzt habe ich das letztendlich so gelöst:
while ( ($image_id, $image_title, $image_small_name) = $select->fetchrow() )
{
# create a two dimensonal array of anonymous hashes
$image_grid[$x][$y] = {
image_id => $image_id,
image_title => $image_title,
image_small_name => $image_small_name,
};
}
Danke für die Hilfe!
Cruz
Gude,
Zuerst frage ich mich warum $image_grid->[$x][$y] und nicht $image_grid[$x][$y]. Aber das kann durchaus seine Gründe haben.
Hat keine Gründe, du hast Recht man kann sich den Pfeil da sparen. :)
Du solltest in Erwägung ziehen -w/use strict; zu verwenden. Perl ist so magisch, das es irgendwann nicht nur dich, sondern auch deine Programme verzaubert ;-)
$ary[] legt ein Array, $ary->[] eine Referenz auf ein Array an.
ad,
kd.