open(my $fh, '>', $path) || die $!;
my_sub($fh);
my_sub() は $fh から $path を推定できますか?
open(my $fh, '>', $path) || die $!;
my_sub($fh);
my_sub() は $fh から $path を推定できますか?
ファイルハンドルは、ファイルに接続されるのではなく、子プロセスの標準出力にフックされたネットワーク ソケットまたはパイプに接続される場合もあります。
コードが開くパスにハンドルを関連付ける場合は、ハッシュと演算子を使用しfileno
ます。
my %fileno2path;
sub myopen {
my($path) = @_;
open my $fh, "<", $path or die "$0: open: $!";
$fileno2path{fileno $fh} = $path;
$fh;
}
sub myclose {
my($fh) = @_;
delete $fileno2path{fileno $fh};
close $fh or warn "$0: close: $!";
}
sub path {
my($fh) = @_;
$fileno2path{fileno $fh};
}
ファイルハンドルまたはファイル記述子からファイル名を見つけるためのより良い方法を探している人は誰でも:
可能であれば、 find -inum を使用したいと思います。または、常に次の方法を使用するのはどうですか-unix / linux互換以外の欠点はありません!
my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
stat
またはファイルハンドルを呼び出すことができますIO::Handle::stat
。これにより、開いたファイルのデバイスとiノードが提供されます。それと少しのオペレーティングシステムのウィザードで、ファイル名を見つけることができます。OK、多分多くのオペレーティングシステムの魔法。
このfind
コマンドには-inum
、指定されたiノード番号を持つファイルを検索するオプションがあります。これは、gbaconが推奨するように、ファイルを開いたときにパスをキャッシュするほど効率的ではない可能性があります。