ファイルがすでにPerlで開いているかどうかを確認する方法はありますか?ファイルの読み取りアクセス権を取得したいので、flock
は必要ありません。
open(FH, "<$fileName") or die "$!\n" if (<FILE_IS_NOT_ALREADY_OPEN>);
# or something like
close(FH) if (<FILE_IS_OPEN>);
_Scalar::Util
_からのopenhandle()
に関する回答 を参照してください。私が最初にここに書いた答えは、かつて私たちができる最善のことでしたが、今ではひどく古くなっています。
Scalar :: Util モジュールは、このために openhandle()
関数を提供します。 fileno() とは異なり、OSファイルハンドルに関連付けられていないPerlファイルハンドルを処理します。 tell() とは異なり、モジュールの documentation から、開かれていないファイルハンドルで使用しても警告は生成されません。
openhandle 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: $!";
Perlは、まさにこの目的のために fileno 関数を提供しています。
[〜#〜] edit [〜#〜]fileno()
を目的として修正されています。私は短いテストを好む
fileno FILEHANDLE
以上
tell FH != -1
Tellは、_use warnings
_(-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
からの出力を保存するのが最良の代替策であることがわかりました。