web-dev-qa-db-ja.com

Perlでファイルハンドルが開いているかどうかを確認するにはどうすればよいですか?

ファイルがすでにPerlで開いているかどうかを確認する方法はありますか?ファイルの読み取りアクセス権を取得したいので、flockは必要ありません。

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

_Scalar::Util_からのopenhandle()に関する回答 を参照してください。私が最初にここに書いた答えは、かつて私たちができる最善のことでしたが、今ではひどく古くなっています。

38
chaos

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
22
brady

なぜそれをしたいのですか?私が考えることができる唯一の理由は、古いスタイルのパッケージファイルハンドル(使用しているように見える)を使用していて、あるハンドルを別のハンドルに誤って保存したくない場合です。

この問題は、新しいスタイルの間接ファイルハンドルを使用して解決できます。

open my $fh, '<', $filename or die "Couldn't open $filename: $!";
11
Leon Timmermans

Perlは、まさにこの目的のために fileno 関数を提供しています。

[〜#〜] edit [〜#〜]fileno()を目的として修正されています。私は短いテストを好む

fileno FILEHANDLE

以上

tell FH != -1

8
converter42

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からの出力を保存するのが最良の代替策であることがわかりました。

1
CoffeeMonster