Sie erhalten entweder ein Objekt IO::File
oder ein Typeglob (\*STDOUT
oder Symbol::symbol_to_ref("main::FH")
); Wie würdest du herausfinden, ob es ein Lese- oder Schreib-Handle ist? Die Schnittstelle kann nicht erweitert werden, um diese Information zu übergeben (Ich überschreibe close
, um Anrufe zu flush
und sync
vor dem eigentlichen Schließen hinzuzufügen).Wie kann ich feststellen, ob ein Perl-Datei-Handle ein Lese- oder Schreib-Handle ist?
Derzeit bin ich versucht zu flush
und sync
die Dateikennung und ignoriert den Fehler "Invalid argument"
(das ist, was ich, wenn ich zu flush
oder sync
ein Lesehandle versuchen):
eval { $fh->flush; 1 } or do {
#this seems to exclude flushes on read handles
unless ($! =~ /Invalid argument/) {
croak "could not flush $fh: $!";
}
};
eval { $fh->sync; 1 } or do {
#this seems to exclude syncs on read handles
unless ($! =~ /Invalid argument/) {
croak "could not sync $fh: $!";
}
};
+1 Fantastische Frage! Ich habe keine Ahnung, wann ich das jemals benutzen würde, aber ich bin fasziniert zu wissen, dass jemand das braucht. – scraimer
Ext4 hat Probleme gebracht, die Ext3 für eine Weile versteckt gehalten hatte. Siehe http://thunk.org/tytso/blog/2009/03/15/dont-fear-the-fsync/ und der laufende p5p-Thread (http://www.xray.mpe.mpg.de/mailing-lists) /perl5-porters/2009-03/msg00322.html) für den Hintergrund. –