es kommt schon mal vor, das ich in einem Ablauf einen Sub mehrmals ausführe, der mir wiederung ein File komplett ausliest und in einen Array speichert und diesen zurückgibt.
zum Beispiel:
so, wenn ich das jetzt mal beispielsweise 2 mal durchführe, dann schmeisst mir dieser sub, das zweite Einlesen der datei in dem Array hinten drann… also der überschreibt nicht die vorhanden Daten, sondern fügt sie hinten an. Wie kann ich ein Array vorher mal löschen, das er den Array neu beschreibt? mit @fileinhalt = „“;
hab ich es schon versucht. Ging aber ned wie mache ich das am schlauesten?
so, wenn ich das jetzt mal beispielsweise 2 mal durchführe,
dann schmeisst mir dieser sub, das zweite Einlesen der datei
in dem Array hinten drann… also der überschreibt nicht die
vorhanden Daten, sondern fügt sie hinten an. Wie kann ich ein
Array vorher mal löschen, das er den Array neu beschreibt? mit @fileinhalt = „“;
hab ich es schon versucht. Ging aber ned wie mache ich das
am schlauesten?
sub readfile {
my @fileinhalt;
open(FILE, ") {
push(@fileinhalt,$_);
}
close(FILE);
return @fileinhalt;
}
ps. immer das pragma use strict; benutzen!
gut, ich habe es jetzt hinbekommen denke ich aber meine Wissensbegierde übersteigt mich Kannst Du mir erklären was das ‚my‘ vor dem Array für eine Bedeutung hat?
Das mit dem use strict habe ich nicht korrekt einbinden können… wie lautet denn der genaue Aufruf für diese ‚use‘ Dinger? und Wofür brauche ich das ‚strict‘ denn (was macht das)? sorry, wenn ich so newbeehaft fragen muss, aber meine ganzen Perl Scripte funktionieren bis jetzt ohne irgend ein ‚use‘ aufruf .
allerdings habe ich aus Selfhtml her, das man ein File so
einlesen sollte:
so gut SelfHTML in HTML, CSS und JavaScript sein mag, so schlecht ist es in Perl. Nach der CGI-Einführung sollte man tunlichst die Finger davon lassen; das meiste was drin steht ist extrem schlechter Stil.
> open(FILE, "allen Dateioperationen sollte man
# den Fehlerfall beachten!
> while() {
> push(@fileinhalt,$\_);
> }
my @fileinhalt = ;
# Den Sinn von lexikalischen Variablen erfährt man bei
# perldoc -f my
# perldoc perlsub
# perldoc perlstyle
> close(FILE);
Schon die Tatsache, daß eine Schleife ausgeführt wird, kostet Zeit und Performance. Im Listenkontext liest Perl die komplette Datei ein und splittet sie an $/ in die Liste, anstatt nach dem nächsten $/ in der Datei zu suchen und den Pointer dorthin weiterzuführen - man spart sich haufenweise Zeit.
Kannst Du mir erklären was
das ‚my‘ vor dem Array für eine Bedeutung hat?
Das mit dem use strict habe ich nicht korrekt
einbinden können… wie lautet denn der genaue Aufruf für
diese ‚use‘ Dinger? und Wofür brauche ich das ‚strict‘ denn
(was macht das)?
die vollständige Perl-Dokumentation befindet sich auf Deiner Festplatte, dort wo Du Perl installiert hast. Tippe an der Kommandozeile „perldoc xyz“ bzw. „perldoc -f xyz“ (Kurzform für „suche in perldoc perlfunc nach xyz“) und Du findest alles, was Du wissen mußt. Bei ActivePerl ist das ganze sogar noch im HTML-Format vorhanden. Suche in diesem Fall nach:
perldoc -f my
perldoc -f use
perldoc strict
perldoc perl
perldoc perlmod
use strict;
weißt den Interpreter an, daß man alle Variablen mit Hilfe von
my deklarieren muß. D.h.
use strict;
my $var1;
$var1=1; #OK
$var2=2; #Fehler!
Das macht man um Programmfehler mit falsch geschriebenen Variablen zu vermeiden.
Eine mit my deklarierte Variable ist nur gültig in ihrem eigenen Namensraum, der durch einen Block gegeben ist ( {} )oder global zu dem Skript. D.h. folgendes:
use strict;
my $test „mich“;
sub t { my $test=„teste“; print $test; }
t; print $test;
Ergibt: „teste mich“
Aufrufe von use immer an den Anfang.
cu, holli
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]
Diese Lösung sieht eigentlich programmiertechnisch besser aus, weil die aktuelle Zeile ins Array gepusht wird, also angehängt… das einzige Problem ist, dass beim nächsten Einlesen weiter hinzugefügt wird und das Array aber nie geleert.
Meine Lösung schmeisst den alten Array-Inhalt einfach weg.
Perl verhält sich aber anders als C.
man kann z.B. sagen
sub pget {
my $pointer; my $var;
$var=1; $pointer=\$var;
return $pointer;
}
my $v;
$v=pget;
print $$v; #=1
Unter C würde die variable auf die der Zeiger zeigt beim Verlassen der Routine zerstört und der Zeiger würde ins Nirwana zeigen (Absturz!!). Perl löscht die Variable erst aus dem Speicher wenn keine Referenzen darauf mehr existieren.
cu, holli
[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]