Cruz: Problem mit Referenzierung

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

  1. 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;-)

    1. 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

      1. 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.