print() on unopened filehandle

Hallo,

ich kann nicht erkennen weshalb ich diesen Fehler (Subject)
bei folgenden Zeilen kriege:

#!/usr/bin/perl -w

use strict;
use File::Find;

find(\&wanted, 'dat');

open(OUT,">dat.liste") or die $!;

sub wanted {
print OUT $File::Find::name."\n";
}

close OUT;

kann mir jemand die Augen öffenen?

Wenn ich das out in der Zeile print OUT... wegnehme wird alles korrekt
ausgegeben.

WARUM?
Gerhard Wolf [ Sa, 30 September 2006 14:32 ] [ ID #1484474 ]

Re: print() on unopened filehandle

Also sprach Gerhard Wolf <quisquiliae [at] gmx.de>

> ich kann nicht erkennen weshalb ich diesen Fehler (Subject)
> bei folgenden Zeilen kriege:
> #!/usr/bin/perl -w
> use strict;
> use File::Find;
> find(\&wanted, 'dat');
> open(OUT,">dat.liste") or die $!;
> sub wanted {
> print OUT $File::Find::name."\n";
> }
> close OUT;
> kann mir jemand die Augen öffenen?
> Wenn ich das out in der Zeile print OUT... wegnehme wird alles korrekt
> ausgegeben.
> WARUM?

Weil in wanted auf ein Filehandle geschrieben werden soll, das
erst eine Zeile später geöffnet wird. Das sollte aber jedem klar sein,
der auch nur minimale Programmierkenntnisse hat.

--
HUMLET, JOHAN, MC COOL:::: bringin da PFFFFFFFT BACK 2 POSENET!!!!!!!!
http://news.motzarella.org
Ray Banana [ Sa, 30 September 2006 14:58 ] [ ID #1484475 ]

Re: print() on unopened filehandle

Gerahrd Wolf:

> Wenn ich das out in der Zeile print OUT... wegnehme wird alles korrekt
> ausgegeben.

Weil dein Code durch die _erste_ Anweisung

> find(\&wanted, 'dat');

die Funktion 'wanted' aufruft und darin das 'print OUT'
durchführt, _bevor_ du mit 'open' die Ausgabedatei zum
Schreiben öffnest. Daran ändert sich auch durch die
Anordnung der Befehle in deinem Skript ('open' for 'print')
nichts.

Mach das 'open' vor dem 'find', und es wird alles wie
gewünscht funktionieren.

PS: Mit dem Debugger hättest du das auch feststellen
können und ein

print OUT $File::Find::name."\n" or die "print failed: $!\n";

hätte dir verraten, dass du versuchst, auf einen nicht
geöffneten Filehandle zu schreiben.

LG, Ferry

--
Ing Ferry Bolhar
Magistrat der Stadt Wien - MA 14
A-1010 Wien
E-Mail: bol [at] adv.magwien.gv.at
Ferry Bolhar [ So, 01 Oktober 2006 14:49 ] [ ID #1486246 ]
Perl » de.comp.lang.perl.misc » print() on unopened filehandle

Vorheriges Thema: Test::Harness & Co. und "die"
Nächstes Thema: Durchsuchen von Verzeichnissen kein Recht