有没有办法检查文件是否已经在 Perl 中打开?我想要读取文件访问权限,所以不需要flock
.
open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
# or something like
close(FH) if (<FILE_IS_OPEN>);
有没有办法检查文件是否已经在 Perl 中打开?我想要读取文件访问权限,所以不需要flock
.
open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
# or something like
close(FH) if (<FILE_IS_OPEN>);
请参阅关于from的答案openhandle()
Scalar::Util
。我最初在这里写的答案曾经是我们能做的最好的,但现在已经严重过时了。
Scalar::Util模块openhandle()
为此提供了功能。与fileno()不同,它处理与操作系统文件句柄无关的 perl 文件句柄。与tell()不同,它在未打开的文件句柄上使用时不会产生警告来自模块的文档:
开口手柄 FH
Returns FH if FH may be used as a filehandle and is open, or FH is a tied handle. Otherwise "undef" is returned. $fh = openhandle(*STDIN); # \*STDIN $fh = openhandle(\*STDIN); # \*STDIN $fh = openhandle(*NOTOPEN); # undef $fh = openhandle("scalar"); # undef
你为什么想这么做?我能想到的唯一原因是当您使用旧式包文件句柄(您似乎正在这样做)并希望防止意外地将一个句柄保存在另一个句柄上时。
该问题可以通过使用新样式的间接文件句柄来解决。
open my $fh, '<', $filename or die "Couldn't open $filename: $!";
use warnings
Tell 使用(-w)生成警告(stat、-s、-e 等也是如此)
perl -wle '
open my $fh, "<", "notexists.txt";
print "can stat fh" if tell $fh
'
tell() on closed filehandle $fh at -e line 1.
-1
替代品fileno($fh)
并eof($fh)
不会产生警告。我发现最好的选择是将输出从open
.