Wie lösche ich einen Array wieder?

und gleich noch eine Frage :wink:

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:

sub readfile {
open(FILE, ") {
push(@fileinhalt,$_);
}
close(FILE);
return @fileinhalt;
}

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 :frowning: wie mache ich das am schlauesten?

gruss
Martin

Machs so. dann geht es.

sub readfile {
my @fileinhalt;
open(FILE, ") {
 push(@fileinhalt,$\_);
}
close(FILE);
return @fileinhalt;
}

ps. immer das pragma use strict; benutzen!

cu, holli

undef @fileinhalt; ?

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 :frowning: wie mache ich das
am schlauesten?

gruss
Martin

lies einfach so ein:

sub readfile {
 open(FILE, ";
 close(FILE);
 return @fileinhalt;
}


Bruno

hi

Machs so. dann geht es.

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 :wink: aber meine Wissensbegierde übersteigt mich :smile: 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 :wink:.

Gruß
Martin

lies einfach so ein:

sub readfile {
open(FILE, ";
close(FILE);
return @fileinhalt;
}

Bruno

jo, 100%ig :smile: Funktioniert :smile:
allerdings habe ich aus Selfhtml her, das man ein File so einlesen sollte:

open(FILE, ") {
 push(@fileinhalt,$\_);
}
close(FILE);

führen denn mal wieder 1000 Wege nach Rom? :wink:

Hi,

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.

führen denn mal wieder 1000 Wege nach Rom? :wink:

In Perl sind es meist noch ein paar Wege mehr :wink:

Cheatah

Hi,

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

Mache Dich mit der Doku unbedingt vertraut!

Cheatah

reHi

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]

allerdings habe ich aus Selfhtml her, das man ein File so
einlesen sollte:

open(FILE, ") {
push(@fileinhalt,$_);
}
close(FILE);

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.

Bruno

Vielleicht kennst du das Konzept der lokalen Variablen aus anderen Programmiersprachen, z.b. C.

Wenn du dort eine Variable in einer Funktion definierst, dann ist sie nur da gültig. Beim nächsten Aufruf der Funktion ist der alte Inhalt wieder weg.

Bruno

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]