You are given either an IO::File
object or a typeglob (\*STDOUT
or Symbol::symbol_to_ref("main::FH")
); how would you go about determining if it is a read or write handle? The interface cannot be extended to pass this information (I am overriding close
to add calls to flush
and sync
before the actual close).
您将获得IO :: File对象或typeglob(\ * STDOUT或Symbol :: symbol_to_ref(“main :: FH”));您将如何确定它是读取还是写入句柄?该接口无法扩展以传递此信息(我在实际关闭之前覆盖接近添加刷新和同步的调用)。
Currently I am attempting to flush
and sync
the filehandle and ignoring the error "Invalid argument"
(which is what I get when I attempt to flush
or sync
a read filehandle):
目前我正在尝试刷新和同步文件句柄并忽略错误“无效参数”(这是我尝试刷新或同步读取文件句柄时得到的):
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 个解决方案
#1
7
Have a look at the fcntl options. Maybe F_GETFL
with O_ACCMODE
.
看看fcntl选项。也许F_GETFL与O_ACCMODE。
Edit: I did a little googling and playing over lunch and here is some probably non-portable code but it works for my Linux box, and probably any Posix system (perhaps even Cygwin, who knows?).
编辑:我做了一些谷歌搜索和午餐玩,这里有一些非可移植的代码,但它适用于我的Linux盒子,可能是任何Posix系统(甚至可能是Cygwin,谁知道?)。
use strict;
use Fcntl;
use IO::File;
my $file;
my %modes = ( 0 => 'Read only', 1 => 'Write only', 2 => 'Read / Write' );
sub open_type {
my $fh = shift;
my $mode = fcntl($fh, F_GETFL, 0);
print "File is: " . $modes{$mode & 3} . "\n";
}
print "out\n";
$file = new IO::File();
$file->open('> /tmp/out');
open_type($file);
print "\n";
print "in\n";
$file = new IO::File();
$file->open('< /etc/passwd');
open_type($file);
print "\n";
print "both\n";
$file = new IO::File();
$file->open('+< /tmp/out');
open_type($file);
Example output:
输出示例:
$ perl test.pl
out
File is: Write only
in
File is: Read only
both
File is: Read / Write
#1
7
Have a look at the fcntl options. Maybe F_GETFL
with O_ACCMODE
.
看看fcntl选项。也许F_GETFL与O_ACCMODE。
Edit: I did a little googling and playing over lunch and here is some probably non-portable code but it works for my Linux box, and probably any Posix system (perhaps even Cygwin, who knows?).
编辑:我做了一些谷歌搜索和午餐玩,这里有一些非可移植的代码,但它适用于我的Linux盒子,可能是任何Posix系统(甚至可能是Cygwin,谁知道?)。
use strict;
use Fcntl;
use IO::File;
my $file;
my %modes = ( 0 => 'Read only', 1 => 'Write only', 2 => 'Read / Write' );
sub open_type {
my $fh = shift;
my $mode = fcntl($fh, F_GETFL, 0);
print "File is: " . $modes{$mode & 3} . "\n";
}
print "out\n";
$file = new IO::File();
$file->open('> /tmp/out');
open_type($file);
print "\n";
print "in\n";
$file = new IO::File();
$file->open('< /etc/passwd');
open_type($file);
print "\n";
print "both\n";
$file = new IO::File();
$file->open('+< /tmp/out');
open_type($file);
Example output:
输出示例:
$ perl test.pl
out
File is: Write only
in
File is: Read only
both
File is: Read / Write