Hilker: merkwürdiges Problem mit if Klausel

Hallo Forum'ler,

im Moment nervt mich, wie schon im Titel beschrieben, eine if Bedingung, die nicht so "möchte" wie ich...
Zunächst schreibe ich ein Datenbankresultat in ein Array of Hashes => @query.
So kann ich mittels $query[$row]{Spaltenname} fein auf das Resultat der Datenmenge zurückgreifen.

ich tue das in diesem Fall mit einer for schleife siehe beispiel:

  
my $i=0;  
for (@query)  
 {  
 if (($$_{lg} != $query[$i-1]{lg}) || ($$_{bg} != $query[$i-1]{bg}))  
  {  
  ### weitere perl anweisungen  
  }  
 elsif ($$_{plz} != $query[($i-1)]{plz})  
  {  
  ### weitere perl anweisungen  
  }  
 .  
 .  
 .  
 ### weitere perl anweisungen  
 .  
 .  
 .  
 if (($$_{lg} != $query[$i+1]{lg}) || ($$_{bg} != $query[$i+1]{bg}))  
  {  
  ### weitere perl anweisungen  
  }  
 else  
  {  
  ### weitere perl anweisungen  
  }  
 $i++;  
 }  

Im obigen Beispiel finden sich zwei ganz ähnliche if Bedingungen, die ganz letzte im code macht mir zu schaffen:
Formuliere ich sie wie im Beispiel, kommt keine ausgabe im Browser zustande... Perl scheint in so etwas wie eine Endlosschleife zu geraten, auch nach langem Warten tut sich keine ausgabe, oder der Browser verweigert ganz und gar seien Dienst...

schreibe ich aber nun anstelle von:
"if (($$_{lg} != $query[$i+1]{lg}) || ($$_{bg} != $query[$i+1]{bg}))", "if (($$_{lg} != $query[$i-1]{lg}) || ($$_{bg} != $query[$i+1]{bg}))" das hier, und rufe das Script über den Browser auf, kommt innerhalb von Bruchteilen von Sekunden die Seite, allerdings falsch zusammengebaut, da die if Bedingung ja geändert ist.

Also WARUM macht dieses eine + bzw. - das ganze script zunichte?
Hat jemand eine Idee dazu? Also mir fällt nichts mehr ein :-(

mfG der Hilker

  1. So auf Anhieb würde ich sagen die Antwort liegt da, wo bei dir

    weitere perl anweisungen

    steht. :)

    Gruß,
    Cruz

    1. So auf Anhieb würde ich sagen die Antwort liegt da, wo bei dir

      weitere perl anweisungen

      steht. :)

      da steht nichts als sowas wie
      $content .= qq{Name:$i $$_{name} $$_{nachname}<br>};
      oder
      $content.= "</div>\n";
      dort wird nur $content mit dem selbigen befüllt...

      Gruß,
      Cruz

      gruß, der hilker

      1. Immer noch ohne den Code gesehen zu haben kann ich weiterhin nur folgendes tippen:

        Mit dieser minimalen Änderung der Bedingung (+ oder -) bewirkst du, dass der Programmfluss in den else Block statt dem if Block (oder eben umgekehrt) gelangt und an der stelle doktorst du vielleicht in @query rum oder erzeugst auf sonstiger Weise eine Endlosschleife. Die Endlosschleife (falls es überhaupt eine ist) stammt jedenfalls nicht _direkt_ aus der if Bedingung.

        Gruß,
        Cruz

        1. Immer noch ohne den Code gesehen zu haben kann ich weiterhin nur folgendes tippen:

          Mit dieser minimalen Änderung der Bedingung (+ oder -) bewirkst du, dass der Programmfluss in den else Block statt dem if Block (oder eben umgekehrt) gelangt und an der stelle doktorst du vielleicht in @query rum oder erzeugst auf sonstiger Weise eine Endlosschleife. Die Endlosschleife (falls es überhaupt eine ist) stammt jedenfalls nicht _direkt_ aus der if Bedingung.

          OK, eine if-bedingung kann schwer einen loop hervorrufen,
          hier mal der code aus if:

            
           if (($$_{lg} != $query[$i+1]{lg}) || ($$_{bg} != $query[$i+1]{bg}))  
             {  
             $content.= "</div>\n";  
             }  
            else  
             {  
             $content.= "<hr size=\"1\">";  
             }  
            $i++; #schleifendurchlauf zähler +1  
            } #end of for schleife  
          
          

          wie gesagt, lasse ich den obigen code aus der for schleife heraus, oder ändere ich im linken || teil der if bedingung das + in ein - läuft die sache...

          Gruß,
          Cruz

          1. Hm..auto vivification?

            wenn du $query[$i+1] in der if Bedingung ansprichst, was ist dann $i+1? Ich kann mir gut vorstellen, das du $i mit 0 initialisierst und dann immer eins hochzählst. Wenn du dich nun im eigentlich letzten Durchlauf von @query befindest, ist $i genau gleich dem letzten Index von @query. Du fragst dann $query[$i+1] ab und auto vivifizierst damit ein neues element im @query array, was dann oben in while(@query) für einen erneuten durchlauf sorgt. Und da hast du deine Endlossschleife.

            Cruz

            1. Hm..auto vivification?

              wenn du $query[$i+1] in der if Bedingung ansprichst, was ist dann $i+1? Ich kann mir gut vorstellen, das du $i mit 0 initialisierst und dann immer eins hochzählst. Wenn du dich nun im eigentlich letzten Durchlauf von @query befindest, ist $i genau gleich dem letzten Index von @query. Du fragst dann $query[$i+1] ab und auto vivifizierst damit ein neues element im @query array, was dann oben in while(@query) für einen erneuten durchlauf sorgt. Und da hast du deine Endlossschleife.

              OK, das ist ein Ansatz...

              Ausprobiert und... Du hattest recht! Sauber - wieso komm ich nicht selbst auf solche einfachheiten?
              Danke!

              Cruz

              der Hilker

  2. ich tue das in diesem Fall mit einer for schleife siehe beispiel:

    Erstmal, benutzt du use strict und Warnungen sind auch eingeschaltet?
    Es gibt keine Warnungen?
    Falls das ein CGI Skript ist, wäre auch noch use CGI::Carp qw/fatalsToBrowser/; sinnvoll. Ich bin mir relativ sicher, dass das Skritp mit einem Fehler abbricht.

    Also WARUM macht dieses eine + bzw. - das ganze script zunichte?
    Hat jemand eine Idee dazu? Also mir fällt nichts mehr ein :-(

    Weil du, soweit ich das sehe, die Grenzen des Array nicht beachtest.

    Struppi.

    1. Hi Struppi,

      ja ich nutze CGI::Carp qw/fatalsToBrowser/; sowie #!/usr/bin/perl -w

      weder das Errorlog, noch cgi geben einen fehler aus...
      das script terminiert nicht, jedoch liegt ein perl prozess vor, der zwar nach kurzer zeit (vermutlich wenn das script abgearbeitet ist) nicht mehr 100% Prozessorlast benötigt, sondern 0%, aber nicht beendet.

      des weiteren habe ich grade mal ALLES innerhalb der if {} bzw. eignetlich alles in der subroutine außer der besagten if clause, auskommentiert, die schleife also wie im eröffnungsposting zu sehen durchlaufen lassen... der selbe effekt...

      irgendwas crashed da,

      gruß, der Hilker

      1. ja ich nutze CGI::Carp qw/fatalsToBrowser/; sowie #!/usr/bin/perl -w

        gut.

        Trotzdem wundere ich mich, dass das hier durchgeht:

        .
        my $i=0;
        for (@query)
         {
         if (($$_{lg} != $query[$i-1]{lg}) || ($$_{bg} != $query[$i-1]{bg}))

        Hier willst mit $i - 1 auf das 0-1. Element zugreifen, d.h. das letzte Element.

        ansonsten würde ich die Dereferenzierung so schreiben:
        $_->{lg}

        Denn soweit ich das verstehe müßte es auch:
        $query[$i-1]->{lg}

        heißen.

        Struppi.

        1. ja ich nutze CGI::Carp qw/fatalsToBrowser/; sowie #!/usr/bin/perl -w

          gut.

          Trotzdem wundere ich mich, dass das hier durchgeht:

          .
          my $i=0;
          for (@query)
          {
          if (($$_{lg} != $query[$i-1]{lg}) || ($$_{bg} != $query[$i-1]{bg}))

          Hier willst mit $i - 1 auf das 0-1. Element zugreifen, d.h. das letzte Element.

          genau...

          ansonsten würde ich die Dereferenzierung so schreiben:
          $_->{lg}

          Denn soweit ich das verstehe müßte es auch:
          $query[$i-1]->{lg}

          heißen.

          hmm, müßte es?

          Struppi.

          ich hab im übrigen nochmal zusätzlich use strict benutzt, was nichts geändert hat.. ich hab das ganze auch mal laufen lassen und es hat mit der fehlermeldung:
          [Mon Feb 06 09:10:41 2006] [error] [client 192.168.1.1] Premature end of script headers: /usr/projekte/home/html/ghostbuster/index.pl
          terminiert

          zudem hab ich mal aufmalen lassen was wärend der dauer so im system cpu und speichermäßig abgeht.

          ein "kästchen" entspricht etwa 6sek. - das script terminierte nach ca. 5,5minuten!

          gruß, der Hilker

          1. ansonsten würde ich die Dereferenzierung so schreiben:
            $_->{lg}

            Denn soweit ich das verstehe müßte es auch:
            $query[$i-1]->{lg}

            heißen.
            hmm, müßte es?

            Wenn du ein Array mit Hashes hast ja.

            ich hab im übrigen nochmal zusätzlich use strict benutzt, was nichts geändert hat.. ich hab das ganze auch mal laufen lassen und es hat mit der fehlermeldung:
            [Mon Feb 06 09:10:41 2006] [error] [client 192.168.1.1] Premature end of script headers: /usr/projekte/home/html/ghostbuster/index.pl

            Dann gibt das Skript keinen Header aus.
            Kannst du das Skript auch in der Konsole oder im DOS Fenster starten?

            Struppi.

            1. Dann gibt das Skript keinen Header aus.
              Kannst du das Skript auch in der Konsole oder im DOS Fenster starten?

              jo sicher, hab ich noch garnicht dran gedacht...
              so...
              am laufenden Band folgendes:
              [Mon Feb  6 09:53:35 2006] index.pl: Use of uninitialized value in numeric ne (!
              =) at kartemalen.pl line 23.
              [Mon Feb  6 09:53:35 2006] index.pl: Use of uninitialized value in numeric ne (!
              =) at kartemalen.pl line 45.
              das sind die besagten if anweisungen in denen steht dieses $user[$i-1]{name}
              aber ich habe doch mit my @user = datenbankresult user zugewiesen?!
              oder ist etwa das $$_{name} gemeint?

              manmanman...

              Struppi.

              der Hilker

              1. Dann gibt das Skript keinen Header aus.
                Kannst du das Skript auch in der Konsole oder im DOS Fenster starten?
                jo sicher, hab ich noch garnicht dran gedacht...
                so...
                am laufenden Band folgendes:
                [Mon Feb  6 09:53:35 2006] index.pl: Use of uninitialized value in numeric ne (!
                =) at kartemalen.pl line 23.
                [Mon Feb  6 09:53:35 2006] index.pl: Use of uninitialized value in numeric ne (!
                =) at kartemalen.pl line 45.
                das sind die besagten if anweisungen in denen steht dieses $user[$i-1]{name}
                aber ich habe doch mit my @user = datenbankresult user zugewiesen?!
                oder ist etwa das $$_{name} gemeint?

                Dann solltest du testen ob ein Wert ist in den Einträgen ist.

                Struppi.

                1. Problem gelöst: (es war wie immer etwas total "hohles")

                  siehe https://forum.selfhtml.org/?t=123053&m=792142

                  Danke Euch beiden

                  der Hilker