for oder foreach ?
Christoph Schnauß
- perl
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);
}
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.
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
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.
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*)
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!