34

有没有办法检查文件是否已经在 Perl 中打开?我想要读取文件访问权限,所以不需要flock.

 open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
 #  or something like
 close(FH) if (<FILE_IS_OPEN>);
4

5 回答 5

38

请参阅关于from的答案openhandle()Scalar::Util。我最初在这里写的答案曾经是我们能做的最好的,但现在已经严重过时了。

于 2009-02-06T13:09:06.193 回答
23

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
于 2011-05-13T14:14:48.673 回答
11

你为什么想这么做?我能想到的唯一原因是当您使用旧式包文件句柄(您似乎正在这样做)并希望防止意外地将一个句柄保存在另一个句柄上时。

该问题可以通过使用新样式的间接文件句柄来解决。

open my $fh, '<', $filename or die "Couldn't open $filename: $!";
于 2009-02-06T13:16:15.430 回答
10

Perl正是为此目的提供了fileno函数。

编辑我站在纠正的目的fileno()。我更喜欢较短的测试

fileno FILEHANDLE

超过

tell FH != -1

于 2009-02-06T19:57:29.347 回答
1

use warningsTell 使用(-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.

于 2010-02-09T21:37:09.830 回答