Michel: Formular Daten in eine Datei schreiben

Hallo Forumsteilnehmer

Bin in einer Webmasterschule und kein grosser Programmierer (auch noch kein kleiner) bleibe irgenwie mit der Logik von Formularfeldern in eine Datei schreiben und Formatieren hängen.

Die Daten Name , Vorname und Emailadresse habe ich korrekt auf dem Server (formular2.pl) eingelesen und ich konnte auch schon eine Antwortseite generieren:
-----------------------------------------------------------------------
#!/usr/bin/perl -w
use CGI qw(:standard);
use strict;
my $name = param('name');
my $vorname = param('vorname');
my $email = param('email');
my $antwort = <<HERE_ANTWORT;
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
      "http://www.w3.org/TR/html4/strict.dtd">
  <html>
<head>
<title>TestPerl</title>
</head>
<body>
<div align="center">
  <h2 align="center">Hallo $name</h2>
  <h4 align="center">Vielen Dank für die Registrierung</h2>
  <h4 align="center">wir werden $email in meine Newsletter Mailingliste aufnehmen</h4>
</body>
</html>
HERE_ANTWORT
print header, $antwort;
----------------------------------------------------------
Wie kriege ich diese Daten in eine Datei (mailingliste.txt) und kann diese Formatieren.Ich habe schon gepröbelt und zusammengestellt:

#!/usr/bin/perl -w
use CGI qw(:standard);
use strict;
$name = param('name');
$vorname = param('vorname');
$email = param('email');

open (FILE, " /etc/mailingliste.txt"
  @lines=<FILE>;
  Close(FILE);

foreach $line(@lines){ "/t";
 @elem=split(".",$line);

Komme aber einfach nicht mehr weiter....  :-(

Vielen Dank für die Hilfe und auch vielen Dank für die vielen hilfen in anderen Diskussionen hier.
Gruss an alle
Mike

  1. Hallo Michael,

    Bin in einer Webmasterschule und kein grosser Programmierer (auch noch kein kleiner) bleibe irgenwie mit der Logik von Formularfeldern in eine Datei schreiben und Formatieren hängen.

    <motz>
    Nur so gefragt: hast Du den Eindruck, das Forum hat als Zweck, Deine Semester- oder Übungsarbeiten zu erstellen? Wenn ich mich recht entsinne, dann war das Forum schon mal aus genau diesem Grund geschlossen.
    </motz>

    open (FILE, " /etc/mailingliste.txt"
      @lines=<FILE>;
      Close(FILE);

    <motz>
    Kannst Du eigentlich Perl?? - Sieht nicht unbedingt so aus!
    </motz>

    open (F, ">xxx.txt") || die $!;
    foreach (@lines) {print F $_;}
    close (F) || die $!;

    Und wenn's nicht klappt, dann denk' mal über \n bei Deinen Eingabedaten nach ...

    Grüße
       K@rl

    1. Hallo Karl

      Erst mal Danke für Deine Bemühungen. Wie Du festgestellt hast kann ich Perl nicht, aber ich habe den Ergeiz es zu erlernen. Nach 2 Tagen Perlschule fällt das ganze jedoch noch ein bisschen schwer .Leider ist dies eine (Abendschule 1-2 mal die Woche)und zudem habne Wir 2 Wochen Pause , also  kann ich halt nicht nachfragen. zudem kenne ich sonnst niemand.
      Ich habe mich die letzten Tage immer wieder im "Kreis" gedreht und brauchte darum ein Anstoss um wieder ein bisschen weiter zu kommen....
      Es handelt sich dev. nicht um eine Semesterprüfung oder ähnliches, es ist nur so das es am Sa gleich mit My SQL Datenbanken weitergeht....

      Danke ,für den Anstoss...
      Gruss Mike

  2. Hallo Mike,

    use CGI qw(:standard);
    $name = param('name');
    $vorname = param('vorname');
    $email = param('email');

    Darf man das eigentlich so, ohne eine Instanz des CGI-Obljekts mit einer Variablen zu eroeffnen? (eigene Frage an die Freaks ;-)

    open (FILE, " /etc/mailingliste.txt"
      @lines=<FILE>;
      Close(FILE);

    Was du da machst, ist, eine Datei einzulesen. Du willst aber doch einfach die Daten in die Datei schreiben, oder? Dann musst du die Datei zum Schreiben oeffnen und mit print-Befehlen in das entsprechende Filehandle schreiben. Also so:

    open(FILE, ">>/etc/mailingliste.txt") or die "Datei nicht gefunden";
    print FILE "$name\n";
    print FILE "$vorname\n";
    print FILE "$email\n";
    close(FILE);

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan,

      use CGI qw(:standard);
      $name = param('name');

      Darf man das eigentlich so, ohne eine Instanz des CGI-Obljekts mit einer Variablen zu eroeffnen?

      ja, durch "use CGI qw/:standard/;"

      Grüße
         K@rl

      (eigene Frage an die Freaks ;-)

      --- Freak .. hmm, na ja, .. .. aber heute zumindest freay drauf ..

      1. open(FILE, ">>/etc/mailingliste.txt") or die "Datei nicht gefunden";

        aus eigener Erfahrung klaptt das mit dem Sprung in ein neues Verzeichnis manchmal nur mit einem Punkt vor dem Slash
        also :

        open(FILE, ">>./etc/mailingliste.txt") or die "Datei nicht gefunden";

        falsch isser nie, also setz ihn einfach :-)

    2. Hallo und Danke schon mal...

      mit :ohne Instanz des CGI-Obljekt meinst Du ein  z.B. "my" vorne dran fehlt?

      Unsere Lehrer haben uns gesagt Wir sollen bessser die Datei einlesen bearbeiten (mit foreach und split etc.) und später wieder abspeichern.Wegen der Sicherheit.
      Wie würde es dann aussehen?

      Grüsse und noch einen schönen Tag an alle.

      1. Hi,

        mit :ohne Instanz des CGI-Obljekt meinst Du ein  z.B. "my" vorne dran
        fehlt?

        Nein. Normalerweise baut man ein CGI-Objekt (mit "new CGI") und nutzt "param" dann als Methode dieses Objektes.

        Unsere Lehrer haben uns gesagt Wir sollen bessser die Datei einlesen
        bearbeiten (mit foreach und split etc.) und später wieder
        abspeichern.Wegen der Sicherheit.

        Dem kann ich mich nicht anschließen.

        Zwei Fälle sind denkbar:

        a) Dein CGI-Skript ist das einzige, welches diese Datei ändert, und es läuft auch nur ein einziges Mal gleichzeitig.
        Dann ist Öffnen der Datei im "append"-Modus (also mit ">>") genauso "sicher" oder "unsicher" wie komplettes Einlesen. Es ist aber performanter - denn der bisherige Inhalt interessiert Dich ja gar nicht.

        b) Irgendwer greift gleichzeitig auf diese Datei zu (das kann auch dasselbe CGI-Skript bei mehreren quasi-parallelen Zugriffen sein).
        Dann hast Du ein Problem - nämlich daß der letzte dieser Zugriffe eventuell die Ergebnisse aller vorherigen Programmläufe zerstört.
        Und das um so sicherer, wenn Du den von den Lehrern beschriebenen Weg gehst - denn in diesem Falle klatscht der letzte _seine_ Sicht der Dinge über die Ergebnisse aller vorherigen Programme drüber, und deren Arbeit ist verloren.
        Wenn mehrere Programme die Datei jeweils erweitern (append), _könnte_ es sein, daß das Betriebssystem diese Datei für alle diese Prozesse zum Schreiben offen hält _und_ die angefügten Daten mischt - das wäre dann auch nicht im Sinne des Erfinders. In all diesen Fällen müßtest Du schon das Öffnen der Datei synchronisieren.

        Viele Grüße
              Michael