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

からの回答をopenhandle()Scalar::Utilご覧ください。私が最初にここに書いた答えは、かつては私たちができる最善の方法でしたが、今ではひどく時代遅れになっています。

于 2009-02-06T13:09:06.193 に答える
23

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
于 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 に答える