Вам предоставляется объект IO::File или типglob (\*STDOUT или Symbol::symbol_to_ref("main::FH")); как бы вы определили, является ли это ручкой чтения или записи? Интерфейс не может быть расширен для передачи этой информации (я переопределяю close, чтобы добавить вызовы к flush и sync до фактического закрытия).
В настоящее время я пытаюсь выполнить flush и sync дескриптор файла и игнорировать ошибку "Invalid argument" (это то, что я получаю при попытке flush или sync читать дескриптор файла):
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: $!";
}
};