Thomas: Hash-Ref / DBI

Hi there

Ich möchte gern wissen, warum Code1 tut, aber Code2 nicht.
Die Pointe liegt in der direkten Umsetzung von der Hash-Referenz in ein Hash.
Wenn ich das Ganze in zwei Schritten mache, also erst die Referenz empfangen und dann daraus ein Hash mache, gehen natürlich beide Codes. Aber ich möchte diesen Umweg gern weglassen.
Nun, wie mach ich das bei Code2? Ist doch eigentlich das selbe.

<Code1>
my %hash  = %{$dbh->selectrow_hashref("select igid, igname, ranking from profil where igid = 1")};
</Code1>

<Code2>
my $sth = $dbh->prepare("select igid, igname, ranking from profil where igid = 1");
$sth->execute();
while (my %hash = %{$sth->fetchrow_hashref})
    {
    # blabla
    }
</Code2>

Ihr fragt euch nun wahrscheinlich, warum ich das überhaupt in einem "eigenen" Hash haben will. Tja, sieht halt einfach schöner bzw. übersichtlicher aus. Der Code in der Folge ist oft schon genug kompliziert.

Für einen Hinweis wär ich sehr dankbar.
Wenn mir keiner helfen kann, ists jedoch auch nicht so schlimm.

  1. Hallo,

    auf einen hash kannst Du nur zwei Dinge tun: einen key und einen value.

    select igid, igname, ranking from profil where igid = 1

    Das sind schon drei Felder, die Du abfragst. Wie sollen denn die in einem hash abgelegt werden?

    Das solltest Du organisieren.

    Viele Grüße,
    Horst Haselhuhn

    1. select igid, igname, ranking from profil where igid = 1

      Das sind schon drei Felder, die Du abfragst. Wie sollen denn die in einem hash abgelegt werden?

      Hab doch geschrieben, dass es mit Umweg tut. Da musst du mir einfach vertrauen.
      was mir fetchrow_hashref liefert ist zum Beispiel folgendes:
      ('igid', 1, 'igname', 'Holzapfel', 'ranking', 3)
      funzt also prächtig mit einem Hash ;)

      1. Hallo,

        select igid, igname, ranking from profil where igid = 1

        Das sind schon drei Felder, die Du abfragst. Wie sollen denn die in einem hash abgelegt werden?

        Hab doch geschrieben, dass es mit Umweg tut. Da musst du mir einfach vertrauen.

        Muss ich gar nicht.

        was mir fetchrow_hashref liefert ist zum Beispiel folgendes:
        ('igid', 1, 'igname', 'Holzapfel', 'ranking', 3)
        funzt also prächtig mit einem Hash ;)

        Du musst nicht, aber kannst ja mal schreiben, wie dieser hash aufgebaut ist und was da drinsteht (oder drinstehen soll). Evntl. ergeben sich daraus auch noch andere Lösungen.

        Viele Grüße,
        Horst

        1. Du musst nicht, aber kannst ja mal schreiben, wie dieser hash aufgebaut ist und was da drinsteht (oder drinstehen soll). Evntl. ergeben sich daraus auch noch andere Lösungen.

          danke, ist aber nicht nötig.
          ich möchte "bloss" wissen warum das beschriebene nicht geht, und nicht eine andere lösung. dafür würde ich euch nicht belästigen und selber eine suchen/finden. ;)

  2. Nun, wie mach ich das bei Code2? Ist doch eigentlich das selbe.

    Ja das mag sein, aber da du immer einen Hash erzeugst wird die Schleife nie beendet.

    while (my %hash = %{$sth->fetchrow_hashref})

    %hash hat immer einen Wert, deshalb wird die Schleife nie beendet.

    Ihr fragt euch nun wahrscheinlich, warum ich das überhaupt in einem "eigenen" Hash haben will. Tja, sieht halt einfach schöner bzw. übersichtlicher aus. Der Code in der Folge ist oft schon genug kompliziert.

    Einmal ist es ungünstig jedesmal eine neue Kopie zu erzeugen und was sieht denn an $hash{key} übersichtlicher aus, als $hash->{key}?

    Struppi.

    1. while (my %hash = %{$sth->fetchrow_hashref})
      %hash hat immer einen Wert, deshalb wird die Schleife nie beendet.

      soweit kommt es gar nicht.
      es gibt ne fehlermeldung: "Can't use an undefined value as a HASH reference".
      d.h. also, dass mir fetchrow_hashref undef zurückgibt.
      wenn ich den rückgabewert aber als scalar entgegennehme, steht da sehr wohl die referenz drin.

      nun zum thema endlosschleife:
      print "ich werde ausgegeben" if %hash = (1,2);
      print "ich nicht" if %hash = ();
      ... würde also auch mit einem hash funzen - meiner meinung nach.

      1. while (my %hash = %{$sth->fetchrow_hashref})
        %hash hat immer einen Wert, deshalb wird die Schleife nie beendet.

        soweit kommt es gar nicht.
        es gibt ne fehlermeldung: "Can't use an undefined value as a HASH reference".
        d.h. also, dass mir fetchrow_hashref undef zurückgibt.

        genau, damit wird while auch beendet.

        wenn ich den rückgabewert aber als scalar entgegennehme, steht da sehr wohl die referenz drin.

        Ja natürlich bis kein Wert mehr ausgelesen werden kann, dann hat die referenz undef.

        Struppi.

        1. genau, damit wird while auch beendet.

          hast recht. es funktioniert bis zum letzten satz, aber dann schmierts wegen undef ab. ich dachte immer es gibt aus irgend einem grund schon beim ersten satz undef.
          thx a lot! :)