Peter: Stringabfrage mit unless oder if

Hi Leute!

Ich habe mal wieder ein Problem als PERL-Anfänger und hoffe auf Eure Mithilfe. Ich habe eine Art kleine Datenbank konzipiert, die auch fehlerfrei funktioniert. Nur wollte ich jetzt die Datenauflistung formatieren und das gelingt mir einfach nicht.

Ich wollte z.B., wenn in den Daten keine eMail-Adresse eingegeben wurde, auch keinen Eintrag im Suchergebnis haben. Zur näheren Erklärung: Ich möchte ein Bild (im Beispiel mail.jpg) nur anzeigen, wenn auch ein eMail-Eintrag in den Daten vorhanden ist.

Hier nun mein PERL-Skript:

$fname = $FORM{'name'};

open(IN,'<daten.csv') or die 'Daten können nicht geoeffnet werden: '.$!;
my($eingangszeile);
while($eingangszeile = <IN>)
   {
   my($name,$vorname,$strasse,$ort,$plz,$url,$email,$telefon,$sperre,$id) = split(/;/,$eingangszeile,10);
   if($fname eq $name) {
     $er = "okay";
     print "<font color=ffc0c0>$name, $vorname, $strasse, $plz $ort, $telefon, <a href=$url target=_blank><img src=homepage.jpg></a>";
     unless($email eq "") { print ", <a href=mailto:$email><img src=mail.jpg></a>"; }
     print "<br>";
   }
   }
close(IN) or die 'Daten können nicht geschlossen werden: '.$!;
<

In der automatisch generierten Datei 'daten.scv' ist eine Liste mit den Daten. Die Datenfelder sind durch Semikola getrennt und ein leeres Feld ist ohne ein Leerzeichen (also z.B. http://www.homepage.de;;) formatiert.

Ich hoffe, Ihr versteht, wie ich es meine.

Vielen Dank für Eure schnelle Unterstützung.

Ciao
Peter

  1. Hi,

    Ich habe eine Art kleine Datenbank konzipiert,

    Pawlow hat mich erwischt: Datei != Datenbank.

    Nur wollte ich jetzt die Datenauflistung formatieren und das gelingt mir einfach nicht.

    Hm. Woran liegt das Deiner Meinung nach?

    $fname = $FORM{'name'};

    Ich vermute, Du möchtest ganz, ganz, ganz dringend

    perldoc CGI

    lesen.

    open(IN,'<daten.csv') or die 'Daten können nicht geoeffnet werden: '.$!;

    Schön!

    my($eingangszeile);

    Listenkontext (Klammern) ist hier zwar nicht falsch, aber auch nicht nötig. Erst wenn Du mehrere Variablen in einer 'my'-Anweisung deklarierst, brauchst Du ihn.

    while($eingangszeile = <IN>)

    Du kannst übrigens auch schreiben:
    while (my $eingangszeile = <IN>) {

    Beachte übrigens, dass ich perldoc perlstyle-konform hinter while ein Leerzeichen gelassen und die geschweiften Klammern in der selben Zeile begonnen habe :-)

    my($name,$vorname,$strasse,$ort,$plz,$url,$email,$telefon,$sperre,$id) = split(/;/,$eingangszeile,10);

    Hast Du Dich darum gekümmert, dass keine ";" innerhalb der einzelnen Felder vorkommen können? Falls ja, hast Du offenbar die Dekodierung vergessen; falls nicht, hast Du ein Problem.

    Die Datenfelder sind durch Semikola getrennt und ein leeres Feld ist ohne ein Leerzeichen (also z.B. http://www.homepage.de;;) formatiert.

    Ja - das nennt sich CSV ;-) Vielleicht ist der Tabulator als Trennzeichen geeigneter; bedenke aber, dass man selbst in Browser-Eingabefeldern dieses Zeichen unterbringen kann.

    Ich hoffe, Ihr versteht, wie ich es meine.

    Ich nehme an Du möchtest wissen, wie Du auf die Existenz einer Mailadresse prüfst. Dazu findest Du in

    perldoc perldata

    einen Absatz, der beschreibt, wann ein Skalar als TRUE gilt (und genau das kannst Du ja mit if abprüfen).

    Cheatah

    1. Hast Du Dich darum gekümmert, dass keine ";" innerhalb der einzelnen Felder vorkommen können? Falls ja, hast Du offenbar die Dekodierung vergessen; falls nicht, hast Du ein Problem.

      Schon mal einen Namen gesehen der ein Semikolon enthält? :)
      Vielleicht werden ja auch einfach alle schon bei der Eingabe entfernt, ohne dass sie irgendwie kodiert werden... Ich weiß es nicht.

      Was mich jedenfalls interessieren würde, wo hat Peter denn seinen Fehler gemacht?

      unless ($email eq "") { ... }

      Sollte (zumindest mal auf den ersten Blick) die bedingte Anweisung dann ausführen, wenn in $email nicht nichts steht. Also so wie

      if ($email ne '') { ... }

      Oder liegt sein Fehler schon darin, dass in E-Mail etwas drinsteht, auch wenn er es nicht erwartet?

      Gruß,
          Stefan

      1. Hi,

        Schon mal einen Namen gesehen der ein Semikolon enthält? :)

        nein, aber eine URL.

        Vielleicht werden ja auch einfach alle schon bei der Eingabe entfernt, ohne dass sie irgendwie kodiert werden... Ich weiß es nicht.

        Das wäre in dem Fall fatal...

        Cheatah

    2. Hoi,

      Beachte übrigens, dass ich perldoc perlstyle-konform hinter while ein
      Leerzeichen gelassen und die geschweiften Klammern in der selben Zeile
      begonnen habe :-)

      Zum Glueck ist 'perldoc perlstyle' nicht Massstab der Dinge ;-)

      Aus perldoc perlstyle:

      Each programmer will, of course, have his or her own
             preferences in regards to formatting, but there are some
             general guidelines that will make your programs easier to
             read, understand, and maintain.

      [...]

      Larry has his reasons for each of these things, but he
             doesn't claim that everyone else's mind works the same as
             his does.

      ;-)

      Gruesse aus dem schoenen LH,
       c.j.k