[Dresden-pm] Destruktoren
Steffen Schwigon
schwigon at webit.de
Fre Jul 25 02:45:18 CDT 2003
Ich bin mir nicht sooo supersicher, also Obacht.
Torsten Werner <email at twerner42.de> writes:
> mal eine Frage: Arbeiten in perl die Destruktoren etwa so wie in C++?
Nicht generell vergleichbar, denke ich, schon weil in Perl das
destruieren an das Garbage Collection gebunden ist. Für Dein
folgendes Beispiel müßte man jetzt konkret das File-Schließen bei
IO::Handle prüfen.
> sub read_files (@) {
> use IO::File;
> my @result;
> for(@_) {
> my $handle = new IO::File $_ or next;
> push @result, $handle->getlines;
> }
> return @result;
> }
>
> Kann ich davon ausgehen, dass am Ende der Funktion alle Dateien wieder
> ordentlich geschlossen wurden?
Es hängt IMHO von der Implementierung von IO::Handle und vom
Garbage Collection ab. Im Manual von IO::Handle steht, daß ein
undef $handle;
das File schließt. Daraus würde ich schlußfolgern, daß es auch beim
garbage-collecten passiert. Obiges Beispiel sollte zumindest sauber
garbage-collect-fähig sein; ob und wann genau das passiert,
entscheidet AFAIK aber der GC.
In der SYNOPSIS von IO::Handle schreiben sie immer explizit "undef
$handle" oder "$handle->close" rein, möglicherweise um genau das
Problem zu betonen. Das könntest Du also nach dem "push" auch tun, um
sicherzugehen, weil Du nicht 100%ig weißt, wann es der GC tut.
> Das ganze ist übrigens eine nette
> Variante des <>-Konstrukts
Wobei <> auch *automatisch* von STDIN liest, wenn keine Dateinamen an
das Programm übergeben wurden. Sehr bequem für Filterskripte.
> und das geht natürlich auch mit Kommandos:
>
> print read_files qw(pwd| hostname| w| ls|);
*Das* ist in der Tat schick. :-)
GreetinX
Steffen
--
Ok, nennt mich verrückt, aber langsam
glaube ich, Elvis ist wirklich tot.
-- Langly