andrea: Schreiben (bzw. Öffnen) von 2 Dateien innerhalb einer Funktion? - Perl

Hallo,

und ich nocheinmal!

Problem:

Ich möchte auf einer mit Perl erstellten HtML-Seite
Textfelder und Textareafelder anzeigen.

Der Inhalt der Textfelder soll aus einer Datei ausgelesen werden:  xxxcccfff
Der Inhalt des Textareafeldes soll aus einer separaten Datei ausgelesen werden
(Ich möchte mehrzeilige Angaben ermöglichen).

Anschießend sollen die angezeigten Angaben (nach eventueller Änderung)
mit einer einzigen Funktion wieder in die Ursprungsdateien zurückgeschrieben
werden (Klick auf Button zum Schreiben aller Felder der Seite).

Wenn ich nur die Textfelder öffne und schreibe klappt es
und wenn ich nur das Textareafeld öffne und schreibe klappt es.
Aber wenn ich alle Felder in einer Funktion öffnen und einer Funktion
schreiben will klappt nix mehr:

#######################

sub modcourtesy {

open (COURTESY, "courtesy.db");
@courtesy = <COURTESY>;
close(COURTESY);
$courtesyline = ($courtesy[0]);
chomp($courtesyline);
($coursender,$coursubject,$courfields) = split(//, $courtesyline);

...

open (COURTEXT, "courtext.txt");
while (<COURTEXT>) {
$_ =~ s/</&#60;/ig;
$_ =~ s/>/&#62;/ig;
push (@courtext,$_);
}
close(COURTEXT);

....

sub writecourtesy {

&checkpassword;

$writecourtesyline = "$FORM{'coursender'}$FORM{'coursubject'}$FORM{'courfields'}\n";
open (WRITECOURTESY, ">courtesy.db");
print WRITECOURTESY "$writecourtesyline";
close(WRITECOURTESY);

open (COURTESY, "courtesy.db");
@courtesy = <COURTESY>;
close(COURTESY);
$courtesyline = ($courtesy[0]);
chomp($courtesyline);
($coursubject,$courtext) = split(//, $courtesyline);

...

$FORM{'courtext'} =~ s/&#60;/</g;
$FORM{'courtext'} =~ s/&#62;/>/g;

@Newcourtext = $FORM{'courtext'};

open (WRITECOURTEXT,">courtext.txt");
        foreach $Newcourtext (@Newcourtext) {
                print WRITECOURTEXT "$Newcourtext\n";
        }
close(WRITECOURTEXT);

##########################

Was mach ich falsch?
Wäre es evtl. auch möglich mehrzeiligen Text innerhalb der $writecourtesyline
abzuspeichern und wieder aufzurufen?

Wenn ich den courtesytext in der $courtesyline/$writecourtesyline mitaufrufe
wird zwar alles gespeichert aber beim aufrufen wird nur die erste Zeile des
Textarea-feldes angezeigt. Nach dem ersten Zeilenumbruch dort wird der Rest
der line nicht mehr ausgelesen.

Habt Ihr einen Tip?

Gruß,

andrea

  1. Hallo,

    sub modcourtesy {

    open (COURTESY, "courtesy.db");
    @courtesy = <COURTESY>;
    close(COURTESY);
    $courtesyline = ($courtesy[0]);

    Nur die erste Zeile wird berücksichtigt. Ist das gewollt?

    warum dann nicht:

    open (COURTESY, "courtesy.db");
    $courtesyline  = <COURTESY>;
    close COURTESY;

    chomp($courtesyline);
    ($coursender,$coursubject,$courfields) = split(//, $courtesyline);

    ...

    open (COURTEXT, "courtext.txt");
    while (<COURTEXT>) {

    »»  $_ =~ s/</<;/ig;
    »»  $_ =~ s/>/>;/ig;

    push (@courtext,$_);

    Hab's nicht ausprobiert, aber ich schreib immer:

    push @courtext, $_;

    }
    close(COURTEXT);

    ....

    Hier wäre noch interessant, wie Du @courtext wirklich ausgibst, vielleicht auch so wie oben mit " $courtesyline = ($courtesy[0])" ?
    Dann wäre es erklärbar.

    machst Du da irgendwie
      print '<textarea name="courtext">',@courtext,'</textarea>';
    dann wäre alles ok.
    wenn da steht
       print '<textarea name="courtext">',$courtext[0],'</textarea>';
    oder ähnliches, dann gibts halt nur die erste Zeile.

    Übrigens:
    Dein anderes Posting, wegen der Leerzeilen.
    wenn Diu schreibst
      <textarea>
    blablabla
      </textarea>

    dann wird _alles_ zwischen dem öffnenden und schleißenden Tag als Text genommen, also auch die von dir eingefügten Zeilenumbrüche.
      <textarea>blablabla</textarea>
    gibt nur genau den text aus, den Du auhc ausgeben willst.

    sub writecourtesy {

    &checkpassword;

    $writecourtesyline = "$FORM{'coursender'}$FORM{'coursubject'}$FORM{'courfields'}\n";
    open (WRITECOURTESY, ">courtesy.db");
    print WRITECOURTESY "$writecourtesyline";
    close(WRITECOURTESY);

    open (COURTESY, "courtesy.db");
    @courtesy = <COURTESY>;
    close(COURTESY);
    $courtesyline = ($courtesy[0]);
    chomp($courtesyline);
    ($coursubject,$courtext) = split(//, $courtesyline);

    ...

    $FORM{'courtext'} =~ s/<;/</g;
    $FORM{'courtext'} =~ s/>;/>/g;

    @Newcourtext = $FORM{'courtext'};

    ^^^^^^^^^^^^^^^^^

    open (WRITECOURTEXT,">courtext.txt");
            foreach $Newcourtext (@Newcourtext) {
                    print WRITECOURTEXT "$Newcourtext\n";
            }
    close(WRITECOURTEXT);

    warum?
    Du machst eine Zuweisung von einem Wert auf ein Array.
    Dadurch steht max. ein Wert im Array.
    dann gibst Du in einer Schleife, die genau einmal durchlaufen wird, diesen Wert aus. Sehr seltsam :-o

    warum nicht gleich

    open (WRITECOURTEXT,">courtext.txt");
    print WRITECOURTEXT $FORM{'courtext'};
    close(WRITECOURTEXT);

    ???

    BTW:
    Fehler abfangen ist auch oft recht brauchbar. z.B.

    open (WRITECOURTEXT,">courtext.txt") or die "nixda mit schreiben auf Datei";

    Grüße
       Klaus

    1. Hallo Klaus,

      Danke für den Schnellkurs!!!

      Hab grad erst angefangen mit perl und versuche anhand von
      bereits bestehenden Scripten zu erkennen, was wie läuft.

      Anscheinend hab ich mir nicht grade die optimale Vorlage
      dazu ausgesucht...

      Auf jeden Fall danke für die Tips.
      Ich werd Deine Vorschläge alle einbauen!

      Muß noch viel lernen!

      andrea

      Hallo,

      sub modcourtesy {

      open (COURTESY, "courtesy.db");
      @courtesy = <COURTESY>;
      close(COURTESY);
      $courtesyline = ($courtesy[0]);

      Nur die erste Zeile wird berücksichtigt. Ist das gewollt?

      warum dann nicht:

      open (COURTESY, "courtesy.db");
      $courtesyline  = <COURTESY>;
      close COURTESY;

      chomp($courtesyline);
      ($coursender,$coursubject,$courfields) = split(//, $courtesyline);

      ...

      open (COURTEXT, "courtext.txt");
      while (<COURTEXT>) {
      »»  $_ =~ s/</<;/ig;
      »»  $_ =~ s/>/>;/ig;
      push (@courtext,$_);

      Hab's nicht ausprobiert, aber ich schreib immer:

      push @courtext, $_;

      }
      close(COURTEXT);

      ....

      Hier wäre noch interessant, wie Du @courtext wirklich ausgibst, vielleicht auch so wie oben mit " $courtesyline = ($courtesy[0])" ?
      Dann wäre es erklärbar.

      machst Du da irgendwie
        print '<textarea name="courtext">',@courtext,'</textarea>';
      dann wäre alles ok.
      wenn da steht
         print '<textarea name="courtext">',$courtext[0],'</textarea>';
      oder ähnliches, dann gibts halt nur die erste Zeile.

      Übrigens:
      Dein anderes Posting, wegen der Leerzeilen.
      wenn Diu schreibst
        <textarea>

      »»  blablabla

      </textarea>

      dann wird _alles_ zwischen dem öffnenden und schleißenden Tag als Text genommen, also auch die von dir eingefügten Zeilenumbrüche.
        <textarea>blablabla</textarea>
      gibt nur genau den text aus, den Du auhc ausgeben willst.

      sub writecourtesy {

      &checkpassword;

      $writecourtesyline = "$FORM{'coursender'}$FORM{'coursubject'}$FORM{'courfields'}\n";
      open (WRITECOURTESY, ">courtesy.db");
      print WRITECOURTESY "$writecourtesyline";
      close(WRITECOURTESY);

      open (COURTESY, "courtesy.db");
      @courtesy = <COURTESY>;
      close(COURTESY);
      $courtesyline = ($courtesy[0]);
      chomp($courtesyline);
      ($coursubject,$courtext) = split(//, $courtesyline);

      ...

      $FORM{'courtext'} =~ s/<;/</g;
      $FORM{'courtext'} =~ s/>;/>/g;

      @Newcourtext = $FORM{'courtext'};
          ^^^^^^^^^^^^^^^^^
      open (WRITECOURTEXT,">courtext.txt");
              foreach $Newcourtext (@Newcourtext) {
                      print WRITECOURTEXT "$Newcourtext\n";
              }
      close(WRITECOURTEXT);

      warum?
      Du machst eine Zuweisung von einem Wert auf ein Array.
      Dadurch steht max. ein Wert im Array.
      dann gibst Du in einer Schleife, die genau einmal durchlaufen wird, diesen Wert aus. Sehr seltsam :-o

      warum nicht gleich

      open (WRITECOURTEXT,">courtext.txt");
      print WRITECOURTEXT $FORM{'courtext'};
      close(WRITECOURTEXT);

      ???

      BTW:
      Fehler abfangen ist auch oft recht brauchbar. z.B.

      open (WRITECOURTEXT,">courtext.txt") or die "nixda mit schreiben auf Datei";

      Grüße
         Klaus