piet: nerviger zeilenumbruch

hallo auch!
folgendes perl-script (ausschnitt) ist nicht davon abzuhalten, im fehlerfall (hier: leeres feld aus html-form) einen nervigen zeilenumbruch zu prduzieren.
ansonsten funktioniert alles bestens- fehlermeldungen gibt's auch keine, nur...

#leere felder prüfen:
my ($check);
$check= new CGI;

sub eintragen
{
        #eintrag vorbereiten
        $date=localtime();
        $betreff=param('betreff');
        $name=param('name');
        $nachricht=param('nachricht');
        $mail=param('mail');

$nachricht=~ s/(?:\015\012?|\012)/<br>/g;

$eintrag="$betreff\t $name\t $date\t $mail\t $nachricht\n";

if ($check->param('name') eq '' || param('mail') eq '' || param('betreff')       eq '' || param('nachricht') eq '')

{
                 chomp ($eintrag);
         }

#eintragen
        open (IN, ">>test.txt") || die ("Technisches Problem: $!\n");
        print IN "$eintrag";
        close IN;
}

ich dachte das prob eigentlich mit dem chomp vertilgt zu haben- irrtum.
kann wer von euch den fehler erkennen?

beste grüße
piet

  1. Hallo;
    mit:
    $derzeilentext =~ s/\n//g;
    wird der Zeilenumbruch entfernt.

    Greetings
    Torwächter

    1. hallo herr "wachtmeister" ;-)
      leider will auch das nicht richtig hinhauen (obwohl's so schön einfach war)

      bzw.- vielleicht hab ich's auch falsch gehandlet:

      if ($check->param('name') eq '' || param('mail') eq '' || param('betreff') eq '' ||              param('nachricht') eq '')
              {
                      $eintrag=~ s/\n//g;
              }

      trotzdem big up für die rekordgeschwindigkeit!

      greetings
      bernd

      1. Hmm,

        dann versuchs mal hiermit:
        $eintrag =~ s/[\n\r]//g;

        oder hiermit:
        $eintrag =~ s/\015\012|\012|\015//g;

        Greetings
        Torwächter

        1. Hallo,

          Du sagst ein Zeilenumbruch.
          Meinst du einen HTML (<br>) oder einen solc
          hen (im Text)?

          Wenn im HTML dann ist diese Zeile dein Fehler:
          $nachricht=~ s/(?:\015\012?|\012)/<br>/g;

          Ansonsten versuchs mit der CodeZeile aus meinem 2ten Posting.

          Greetings
          Torwächter

        2. hi wächter,
          klappt beides nicht...

          thx anyway
          piet

  2. Hej,

    kommt die If-Bedingung jemals vor?

    Marko

    if ($check->param('name') eq '' || param('mail') eq '' || param('betreff')       eq '' || param('nachricht') eq '')

  3. use Mosche;

    folgendes perl-script (ausschnitt) ist nicht davon abzuhalten, im fehlerfall (hier: leeres feld aus html-form) einen nervigen zeilenumbruch zu prduzieren.

    Ich habe jetzt ein bisschen über dein Script drübergeguckt - und habe einiges gefunden, was man verbessern kann

    #leere felder prüfen:
    my ($check);
    $check= new CGI;

    my $check = new CGI; # ist als einzeiler schöner, oder?

    sub eintragen
    {
            #eintrag vorbereiten
            $date=localtime();

    $betreff=param('betreff');
            $name=param('name');
            $nachricht=param('nachricht');
            $mail=param('mail');

    Warum benutzt du oben das CGI Modul über den OOP-Ansatz und hier direkt?

    $nachricht=~ s/(?:\015\012?|\012)/<br>/g;

    $eintrag="$betreff\t $name\t $date\t $mail\t $nachricht\n";

    if ($check->param('name') eq '' || param('mail') eq '' || param('betreff')       eq '' || param('nachricht') eq '')

    Frag das ganze doch vorher ab, und setze darauf hin $eintrag.

    Alleine durch das ">>" beim öffnen der Datei wird der Zeilenumbruch erzeugt. Du kannst das ganze umgehe, indem du dein Script anders aufbaust:

    my $c = new CGI;

    if ($c->param('name') && $c->param('mail') && $c->param('betreff') && $c->param('nachricht')) {
     # Fehlermeldung ausgeben
     print "<h1>Irgendwas nicht angegeben</h1>";
    } else {
     my $date = localtime();
     # alle Eintraäge vorhanden
     my $nachricht = $c->param('nachricht');
     $nachricht=~ s/(?:\015\012?|\012)/<br>/g;

    # da du \t ale Begrenzerzeichen benutzt,
     # solltest du auch die \t hier escapen
     $nachricht =~ s/\t/\t/g;
     open (FH, ">>dein_file") or die "Fehler: $!";
     print FH $c->param('betreff'), "\t", $c->param('name'),
      "\t$date\t," $cparam('mail'), "\t", $c->param('nachricht'),
      "\n";
     close(FH);
    }

    So sollte es besser funktionieren...

    use Tschoe qw(Matti);

    1. use Mosche;

      if ($c->param('name') && $c->param('mail') && $c->param('betreff') && $c->param('nachricht')) {

      ...und statt if sollte hier besser unless stehen, wenn bei wahrer Abfrage die Fehlermeldung kommt...

      use Tschoe qw(Matti);

    2. hi matti,
      erstmal besten dank für die anregungen zum code.
      eins ist mir bei deinem ansatz nicht ganz klar:

      warum wird durch dieses konstrukt

      print FH $c->param('betreff'), "\t", $c->param('name'),
        "\t$date\t," $cparam('mail'), "\t", $c->param('nachricht'),
        "\n";
      close(FH);

      das hier vermieden?

      Alleine durch das ">>" beim öffnen der Datei wird der Zeilenumbruch erzeugt. Du kannst das ganze umgehe, indem du dein Script anders aufbaust:

      ansonsten scheint imho genau das der kern zu sein:

      solltest du auch die \t hier escapen

      $nachricht =~ s/\t/\t/g;

      wenn ich das auf meinen $eintrag anwende, tut sich allerdings nichts (fehler gibt es aber auch keinen).
      immerhin ist das ziel jetzt viel klarer:
      entferne alle \t+\n und das ">>" (wie letzteres funktionieren soll, weiss ich nicht)

      hast du evtl. noch eine idee?

      greetings
      piet