Hansi: einfache IF-Abfrage !?

Hallo an alle,

seit einigen Stunden versuche ich nun schon, dem Fehler einer einfachen Abfrage auf die Spur zu kommen.

Hier erst einmal der Quelltext:

sub print_message
  {
  open(MESSAGE, "< $_[0]");
  while (<MESSAGE>)
    {
...
      }
    elsif($_ =~ /url=/)
      {
      $_ =~ s/url=//gi;
      $_ =~ s/\n//gi;
      $_ =~ s/ //gi;
      $hurl = $_;
      chop ($hurl);
      }
...
    }
  close (MESSAGE);

print "Eintrag vom $date um $time Uhr<br>";
  print "von <a href="mailto:$email">$name</a>";
  $iurl = length($hurl);
  if (int($iurl) > 0)
    {
    $ibanner = length($banner);
    $ititle = length($title);
    if ($ibanner > 0)
      {
      $printbanner = 1;
      }
    elsif ($ititle > 0)
      {
      print " - Homepage: ";
      print "<a href="$hurl">$title</a>";
      }
    else
      {
      print " - Homepage: ";
      print "<a href="$hurl">$hurl</a>";
      }    
    }
  print "<p>\n";
  print "$message<p>\n";

if ($printbanner == 1)
    {
    print "<center>\n";
    print "<a href="$hurl">";
    print "<img src="$banner">";
    print "</a>";
    print "</center>";
    print "<p>";
    }
  
  print "<hr>\n";
  }

Zuerst wird eine Dateiliste aufgerufen. Für jede gefundene Datei wird die Funktion print_message (s.o.)aufgerufen. Die Funktion soll nun eben den Inhalt jeder Datei im Browser ausgeben. Wenn in der Datei eine Url angegeben ist, soll diese natürlich auch ausgegeben werden. Und zwar, wenn die Url eines Images vorhanden ist dann mit einem verlinkten Image, wenn ein Titel angegeben ist, dann mit Titel und wenn nur die Url vorhanden ist, dann nur die Url. Wenn eine Banner ausgegeben wird, dann soll dieses am Ende des Eintrags eingefügt werden. Wenn nicht, dann soll die Url mit Titel oder ohne, hinter den Namen geschrieben werden. Das ganze ist wie man sieht für ein Gästebuch.

Nun das Problem:
egal wie ich die Länge abfrage, das Banner wird immer ausgegeben, obohl die Länge definitiv 0 ist. Ich habe mir die Länge mit einem print-Befehl ausgeben lassen. Ich habe auch "if(length($url) > 0)" ausprobiert und zahlreiche andere mehr oder weniger sinnvolle Konstruktionen.

HILFE!!! Was mache ich falsch? *HEUL*

Das gibt es doch nicht, daß man an so einer einfachen Sache so lange (ca. 3 Std.) sitzen kann. Normalerweise kann doch bei solch einer Abfrage überhaupt kein Fehler auftauchen.

Eigentlich schon ein Hohn, solch eine Nachricht für dieses kleine Problem zu schreiben. *SCHÄM*

Bitte, bitte erbarmt euch.

Danke schon mal im voraus.

Hansi

  1. Hi Hansi,

    Ich habe momentan nicht die Muße, mir deinen Code komplett anzusehen, aber warum gibst Du die Werte von

    $ibanner = length($banner);
        $ititle = length($title);

    und den anderen Längenangaben nicht mal mit einem "print" aus ... und siehst, ob sie *wirklich* == 0 sind?

    Ciao
      K@rl

    1. Hallo K@arl,

      und den anderen Längenangaben nicht mal mit einem "print" aus ... und siehst, ob sie *wirklich* == 0 sind?

      habe ich schon überprüft, die Längenangaben werden richtig angegeben. Als wenn nichts drin steht, dann sind sie auch null.

      Danke
      Hansi

  2. hi!

    elsif($_ =~ /url=/)
          {
          $_ =~ s/url=//gi;
          $_ =~ s/\n//gi;
          $_ =~ s/ //gi;
          $hurl = $_;
          chop ($hurl);
          }

    "$_ =~ " kannst du in jedem Fall weglassen, da sowieso schon Standard. Da du alle \n-Zeichen schon vorher löschst, verstehe ich hier allerdings nicht, was das chop noch soll.

    $iurl = length($hurl);
      if (int($iurl) > 0)

    Kürzer:
      if ($url)
    Wenn $url größer 0 bzw. kein Leerstring ist, wird wahr zurückgegeben und der Block ausgeführt.

    {
        $ibanner = length($banner);
        $ititle = length($title);

    Woher kommen $banner und $title?

    if ($ibanner > 0)
        elsif ($ititle > 0)

    s.o.: if ($banner) bzw. if ($title) verwenden.

    egal wie ich die Länge abfrage, das Banner wird immer ausgegeben, obohl die Länge definitiv
    0 ist. Ich habe mir die Länge mit einem print-Befehl ausgeben lassen. Ich habe auch
    "if(length($url) > 0)" ausprobiert und zahlreiche andere mehr oder weniger sinnvolle
    Konstruktionen.

    Versuch es mal mit "if ($url)", vielleicht klappt es. Ansonsten kann ich spontan keinen Fehler entdecken.

    bye, Frank!

    1. Hallo,

      zunächst einmal Danke für Deine Mühe:-)

      "$_ =~ " kannst du in jedem Fall weglassen, da sowieso schon Standard. Da du alle \n-Zeichen schon vorher löschst, verstehe ich hier allerdings nicht, was das chop noch soll.

      Das chop und das entfernen der Leerzeichen waren zusätzlich VERZWEIFELTE Versuche. Tatsächlich schaute/schaut der Block so aus.

      elsif($_ =~ /url=/)
         {
         $_ =~ s/url=//gi;
         $_ =~ s/\n//gi;
         $hurl = $_;
         }

      Kürzer:
        if ($url)
      Wenn $url größer 0 bzw. kein Leerstring ist, wird wahr zurückgegeben und der Block ausgeführt.

      habe ich gerade noch einmal ausprobiert. Geht nicht:-{

      Woher kommen $banner und $title?

      if ($ibanner > 0)
          elsif ($ititle > 0)

      s.o.: if ($banner) bzw. if ($title) verwenden.

      $banner und $titel werden gleich wie $hurl abgefragt.
      elsif($_ =~ /url=/)
         {
         $_ =~ s/url=//gi;
         $_ =~ s/\n//gi;
         $hurl = $_;
         }
      elsif($_ =~ /banner=/)
         {
         $_ =~ s/banner=//gi;
         $_ =~ s/\n//gi;
         $banner = $_;
         }
      elsif($_ =~ /title=/)
         {
         $_ =~ s/title=//gi;
         $_ =~ s/\n//gi;
         $titel = $_;
         }
      usw.

      Versuch es mal mit "if ($url)", vielleicht klappt es. Ansonsten kann ich spontan keinen Fehler entdecken.

      bringt leider kein anderes Ergebnis. Diese Abfrage scheint einfach ignoriert zu werden.

      Ich dachte, nschdem ich ein bißchen geschlafen habe, würde sich die Fehlerlösung von selbst auftun (ist ja meißtens so), aber da hab ich mich wohl verkalkuliert.

      *HILFE*

      Gruß Hansi

    2. Hallo!

      $iurl = length($hurl);
        if (int($iurl) > 0)

      Kürzer:
        if ($url)
      Wenn $url größer 0 bzw. kein Leerstring ist, wird wahr zurückgegeben und der Block ausgeführt.

      Die Formulierung läßt sich aber dummerweise nicht über den String '0' aus. Zahlen und
      Strings werden in Perl ja zusammen in Scalaren abgelegt. Das heißt, wenn die Zahl 0 einem
      FALSE entsprechen soll, dann gilt dies auch für den String '0' mit der Länge eins. Nun ist
      es hier zwar relativ unwahrscheinlich, daß eine URL mit dem Inhalt '0' aufkreuzt, aber verallgemeinern
      darf man diese Kurzform von if(length($string)) sicherlich nicht ...

      Jörk

  3. Bitte verzeiht mir,

    Die Lösung ist so einfach!*ARGH*

    $iurl = length($hurl);
      if (int($iurl) > 0)
        {
        $ibanner = length($banner);
        $ititle = length($title);
        if ($ibanner > 0)
          {
          $printbanner = 1;
          }
        ....    
        }

    »»   ....

    if ($printbanner == 1)
        {
        ....
        }
      
      print "<hr>\n";
      }

    Dies ist eine Unterfunktion, welche innerhalb einer while-Schleife mehrmals aufgerufen wird!!!

    Das heißt natürlich, daß die Variabeln, welche beim erneuten Aufruf nicht neu belegt werden, immer noch die alten Werte enthalten. Ich Hirnvieh habe die Variable $printbanner nicht LOKAL definiert.

    Bitte vergebt mit diese Hirnlosigkeit.

    Danke schon mal im voraus.
    Hansi

    1. Das heißt natürlich, daß die Variabeln, welche beim erneuten Aufruf nicht neu belegt werden, immer noch die alten Werte enthalten. Ich Hirnvieh habe die Variable $printbanner nicht LOKAL definiert.
      Bitte vergebt mit diese Hirnlosigkeit.

      Das ist der Grund, weshalb ich bei Perl *alles* and Diagnosehilfe einschalte, was auch nur irgendwie geht.
      Insbesondere "use strict", was mich dazu zwingt, alle Variablen mit "my" oder "local" zu deklarieren - und dann bin ich mir *bewußt*, daß es eine lokalen bzw. globale Variable ist.

      Dein Fehler ist absolut verständlich ...