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>);
からの回答をopenhandle()
Scalar::Util
ご覧ください。私が最初にここに書いた答えは、かつては私たちができる最善の方法でしたが、今ではひどく時代遅れになっています。
Scalar::Utilモジュールは、このための関数を提供しますopenhandle()
。fileno()とは異なり、OS ファイルハンドルに関連付けられていない 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: $!";
Perlは、まさにこの目的のためにfileno関数を提供します。
編集私はの目的で修正された立場にありfileno()
ます。私は短いテストを好みます
fileno FILEHANDLE
以上
tell FH != -1
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
。