[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