Christoph Schnauß: for oder foreach ?

n'abends ;-)

zu Testzwecken hab ich mal folgendes file zusammengeschustert:

==========

#! D:/Perl/bin/perl.exe

$basedir = "E:/experimental/temp";

$openfile = "test0.htm";
$newfile = "test1.htm";

open(ORIGINAL,"$basedir/$openfile") || die $!;
@datei = <ORIGINAL>;
close(ORIGINAL);

sub auslesen {
   print "Content-type: text/html\n\n";
   foreach $zeile (@datei) {
   print "$zeile";
   }
}

sub erstellen {
   open(NEU,">$basedir/$newfile") || die $!;
   foreach $zeile (@datei) {
   print NEU "$zeile";
   }
   close(NEU);
}

&auslesen;
&erstellen;

ok, is schon klar, das läuft auf einer Windows-Kiste (läuft aber mit anderer shebang und angepaßten Pfaden auch mit der SUSE LINUX und mit *BSD), der lokale Webserver ist - natürlich  -  Apache.

Bisher macht das Ding nix anderes als eine bereits bestehende Datei "test0.htm" schlichtweg zu kopieren und als neue Datei "test1.htm" gleichzeitig anzuzeigen und im Hintergrund auf dem Server abzulegen. Es soll letzten Endes dazu ausgebaut werden, daß ich für beliebige HTML-Dokumente Korrekturfunktionen automatisieren kann.

Das Problem ist für mich der Array, in den der Inhalt der bereits bestehenden Datei gepackt wird. Die Zeile
   foreach $zeile (@datei)
funktioniert auch in der Form
   for $zeile (@datei)
und jetzt bin ich verunsichert, was ich einsetzen soll: "for" oder "foreach" ?

Wenn ich "foreach" nehme, kann ich zum Beispiel so vorgehen:
   foreach $zeile (@datei){
     if($zeile =~ /<body>/) {
      ...
     }
   }
womit ein ganz bestimmtes HTML-Element gegebenenfalls neu formatiert würde ... vorausgesetzt, es ist in der Originaldatei genauso vorhanden wie ich es hier in der Form <body> erwarte

Wenn ich "for" nehme, könnte ich die HTML-Elemente durchzählen und festlegen, daß z.B. immer das elfte eben <body> heißen soll...

Sind diese beiden Annahmen richtig ?

Beides sind für mich "Sicherheitsrisiken". Hintergrund: Für eine Adresse, auf die mehrere Leute Zugriff haben und HTML-Dokumente hochladen können (die ich nicht kenne), möchte ich mit einem "Korrekturscript" sicherstellen, daß diese Dateien automatisch W3C-konform neu geschrieben werden, ohne daß ich das jedesmal "von Hand" machen muß.

Außerdem: spielt die Reihenfolge, in der ich die einzelnen Zeilen meines Perl-Scripts notierte, eine Rolle (ich meine damit nicht, daß die shebang als erste Zeile stehen muß) ?

Grüße aus Berlin

Christoph S.

  1. Hi Christoph,

    #! D:/Perl/bin/perl.exe

    wo ist "use strict", ey? ;-)

    &auslesen;
    &erstellen;

    ähem ... old-style-Funktionsaufrufe?
    (Das ist eher Perl4 als Perl5, denke ich - ich mag sie
    jedenfalls nicht - um so weniger, als sie anders aus-
    sehen als Funktionsaufrufe in jeder anderen mit be-kannten Sprache.)

    Die Zeile
       foreach $zeile (@datei)
    funktioniert auch in der Form
       for $zeile (@datei)

    TIMTOWTDI

    und jetzt bin ich verunsichert, was ich einsetzen
    soll: "for" oder "foreach" ?

    "The foreach keyword is actually a synonym for the for
     keyword, so you can use foreach for readability or for
     for brevity."

    spielt die Reihenfolge, in der ich die einzelnen
    Zeilen meines Perl-Scripts notierte, eine Rolle
    (ich meine damit nicht, daß die shebang als erste
    Zeile stehen muß) ?

    Du kannst in der Tat Hauptprogramm und Funktionen
    "mischen".

    Ich mache das selbst auch.
    Und zwar will ich bestimmte Dinge ganz oben haben
    ("use strict;" beispielsweise, aber auch
    Konfigurations-Abschnitte von Skripten, eingebrannte
    Pfadnamen, Debug-Flags etc.), damit die von jemandem,
    der nicht Perl kann, problemlos geändert werden können.
    Typischerweise endet dieser Teil mit einem Kommentar
    "do noch change anything below this line".
    Teilweise stehen dort auch einige globale Variablen,
    die ich in den nachfolgenden Funktionen verwenden will,
    auch wenn sie erst sehr viel tiefer dann wirklich einen
    Wert bekommen. (Ich habe halt noch gelernt, daß Para-
    meterübergabe CPU-Zeit kostet ...)

    Als nächstes folgt dann die Definition meiner lokalen
    Funktionen.
    Allerdings mit newstyle-Parameterlistenbeschreibung,
    so daß Perl bei späteren Aufrufen prüfen kann, ob ich
    die richtige Anzahl Parameter übergeben habe etc.

    Und als letztes dann der Rest des Hauptprogramms, mit
    den entsprechenden Aufrufen.
    Sortiert man das anders herum, dann gibt es Warnungen,
    daß Perl nicht prüfen kann, ob die Funktionsaufrufe
    passen (offenbar macht der Perl-Parser nur einen
    einzigen Durchgang bei der Syntaxprüfung - tempo-
    optimiert statt sicher ... Hackersprache, gnlpfts).

    Viele Grüße
          Michael

    1. hallo Michael,

      #! D:/Perl/bin/perl.exe
      wo ist "use strict", ey? ;-)

      spielt in diesem "Stadium" noch keine Rolle. Wenns allerdings ums Prinzip gehen sollte ... ok, ich trags ein.

      &auslesen;
      &erstellen;
      ähem ... old-style-Funktionsaufrufe?
      (Das ist eher Perl4 als Perl5, denke ich

      ups. Sind meine "Gewohnheiten" tatsächlich schon so alt ? Muß ich schleunigst ändern

      "The foreach keyword is actually a synonym for the for keyword

      wo haste denn das her? Ich hoffe, du glaubst mir, daß ich mich vor meinem posting auch nochmal bissel zu belesen versucht habe, aber _das_ kannte ich bisher als gültige Aussage noch nicht.

      Du kannst in der Tat Hauptprogramm und Funktionen
      "mischen".

      eine meiner Sorgen dabei  -  betrifft allerdings nicht so sehr meine "aktuelle" Nachfrage, sondern Perl insgesamt bzw. das, was ich davon verstanden hab. Irgendwie kriege ich das Prinzip OOP mit Perl noch nicht schlüssig zusammen  -  die Betonung liegt auf "schlüssig".

      Grüße retour
      (aus Berlin natürlich)

      Christoph S.

      1. Hallo,

        spielt in diesem "Stadium" noch keine Rolle. Wenns allerdings ums Prinzip gehen sollte ... ok, ich trags ein.

        Es geht prinzipiell immer um das Prinzip;-)

        "The foreach keyword is actually a synonym for the for keyword

        wo haste denn das her? Ich hoffe, du glaubst mir, daß ich mich vor meinem posting auch nochmal bissel zu belesen versucht habe, aber _das_ kannte ich bisher als gültige Aussage noch nicht.

        Laß mich raten, ... hmm, wo steht doch gleich das Zeugs mit den Schleifen, ah ja, perldoc perlsyn wird' swohl sein. Laß mich nachsehen.... genau da steht's ja *g*.

        Grüße
          Klaus

        PS.: bei der OOP-Sache halt ich mirch raus, da sollen 'die G'studierten' ran, die können das besser. Ich mach's halt, so wie ich es mir denke, und wenn dabei ein Blödsinn rauskommt, dann denke ich weiter nach, sonst lass ich's, bis mich wieder irgendwas stört. Ob es dabei der 'reinen und wahren Lehre' entspricht, dafür kenne ich mich einfach zu wenig aus (und all die OOP-Bücker, die ich bisher gelesen habe, sind mir einfach zu wenig schlüssig, pardon, zu kompliziert, als daß ich sie verstehen würde *gg*)

      2. hi!

        "The foreach keyword is actually a synonym for the for keyword
        wo haste denn das her? Ich hoffe, du glaubst mir, daß ich mich vor »» meinem posting auch nochmal bissel zu belesen versucht habe, aber
        _das_ kannte ich bisher als gültige Aussage noch nicht.

        perldoc perlsyn, wo es hingehört. Dort unter "Foreach Loops".

        Du kannst in der Tat Hauptprogramm und Funktionen
        "mischen".
        eine meiner Sorgen dabei  -  betrifft allerdings nicht so sehr meine
        "aktuelle" Nachfrage, sondern Perl insgesamt bzw. das, was ich davon
        verstanden hab. Irgendwie kriege ich das Prinzip OOP mit Perl noch
        nicht schlüssig zusammen  -  die Betonung liegt auf "schlüssig".

        Irgendwie fehlen mir hier die konkreten Fragen. Und das mit der
        Reihenfolge der einzelnen Zeilen verstehe ich noch nicht: Funktionen
        kannst du natürlich anordnen, wie du willst. Die Zeilen innerhalb
        eines Blocks aber nicht. Ansonsten bitte detailliertere Fragen... ;)

        bye, Frank!