Christian Kruse: Betriebsblindheit :-(

Beitrag lesen

Hallo Christoph,

nachdem sich oesi50 so in die Nesseln gesetzt hat, schreibe ich mal,
was mir zu dem Script so auffaellt.

Zunaechst waere das einmal, dass Du das Meta 'strict' nicht benutzt.
Das wuerde ich an deiner Stelle dringend tun, dann wirds auch weniger
mit den Fehlern. Dann oeffnest du jegliche Dateien mit ohne
Filelocking. Auch das musst du *dringend* aendern. Du kannst ja z.B.
das Modul vom Selfforum nehmen, das ist da sehr einfach zu
bedienen und IMHO relativ sicher. Dann wuerde ich an deiner Stelle
statt 'parse_form' 'use CGI qw/param/' benutzen. Dann laesst sich
eine Stelle ganz stark verkuerzen:

if ($followup == 1) {
      foreach $followup_num (@followup_num) {
         print NEU "$followup_num,";
      }
   }

in:

print NEU join(',',@followup_num),',' if $followup;

Dann weiter:

@zeilen1 = split(/<p>/,$hidden_body);

Es ist ein Fehler, zuviel zu maskieren:

@zeilen1 = split(/<p>/,$hidden_body);

Dann kannst du den ganzen Abschnitt

foreach $zeile1 (@zeilen1) {
      @zeilen = split(/&lt;br&gt;/,$zeile1);
      foreach $zeile (@zeilen) {
         print NEU "»» $zeile\n";
      }
   }

Viel besser so schreiben:

$hidden_body =~ s/<p>/\n\n/sg;
$hidden_body =~ s/<br>/\n/sg;
print $hidden_body;

Das ist erstens viel schneller und zweitens viel kuerzer.

Dann ist mir aufgefallen, dass du in den open()-Aufrufen ab und zu
den Open-Modus nicht mit angibst. Das wuerde ich an deiner Stelle
tun. Also anstelle von 'open(MAIN,"$basedir/$mainfile")' besser
'open(MAIN,"<$basedir/$mainfile")'. Gut, weiter:

open(MAIN,"$basedir/$mainfile") || die $!;
   @main = <MAIN>;
   close(MAIN);

Das wuerde ich an deiner Stelle so nicht tun. Das ist erstens sehr
langsam und zweitens sehr Speicherintensiv. Schreibe lieber die
neue Datei erstmal in eine temporaere Datei (z. B.
"$basedir/$mainfile.$$") und benenne die dann um. Dann kannst du
naemlich statt dem 'foreach $main_line (@main)' ein sinnvolleres
'while($main_line = <MAIN>)' machen. Dasselbe natuerlich in 'sub
thread_pages' auch. Und dann wuerde ich an deiner Stelle den Einsatz
von Here-Dokumenten mir ganz schwer ueberlegen :-) Dann folgende
Zeile:

print "<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">\n";

Bist du dir *sicher*, dass du diesen Charset benutzen willst? Der
ist ziemlich boese...

Dann Aufrufe wie '&rest_of_form;'. Die wuerde ich aendern in
'rest_of_form();', einfach aus dem Grunde, dass bei der ersten
Version @_ nicht neu gesetzt wird. Wenn ich also schreibe '@_ =
qw(hallo du da);', dann enthaelt @_ in der Funktion immer noch
('hallo','du','da').

Dann das hier:

$FORM{'body'} =~ s/\r\n/\n/g;

Schreib besser

$FORM{body} =~ s/\015\012|\012|\015/\012/g;

Dann gilt das ganze Plattformunabhaengig.

Gruesse,
 CK