我可以从Perl中的文件句柄中找到文件名吗?

我可以从Perl中的文件句柄中找到文件名吗?,perl,filenames,filehandle,Perl,Filenames,Filehandle,my_sub()能否从$fh中推断出$path?文件句柄甚至可能没有连接到文件,而是连接到网络套接字或连接到子进程标准输出的管道 如果要将句柄与代码打开的路径关联,请使用哈希和运算符,例如 my%fileno2path; 亚肌笔{ 我的($path)=@; 打开我的$fh,“你可以在文件句柄上调用stat或IO::Handle::stat,这将为你提供你打开的文件的设备和inode。有了它和一点操作系统向导,你可以找到文件名。好的,也许有很多操作系统向导 find命令有一个-inum选项,用于

my_sub()能否从$fh中推断出$path?

文件句柄甚至可能没有连接到文件,而是连接到网络套接字或连接到子进程标准输出的管道

如果要将句柄与代码打开的路径关联,请使用哈希和运算符,例如

my%fileno2path;
亚肌笔{
我的($path)=@;

打开我的$fh,“你可以在文件句柄上调用
stat
IO::Handle::stat
,这将为你提供你打开的文件的设备和inode。有了它和一点操作系统向导,你可以找到文件名。好的,也许有很多操作系统向导



find
命令有一个
-inum
选项,用于查找具有指定索引节点编号的文件。这可能不如gbacon建议的在打开文件时缓存路径那样有效。

可能正在寻找从文件句柄或文件描述符查找文件名的更好方法的人:

如果可以的话,我更愿意使用find-inum。 或者,使用下面的方法如何?除了unix/linux兼容之外,还有什么缺点吗

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};
}

谢谢。这不是我想听到的,而是更有效的解决方法。如果你手头没有文件句柄(例如,你正在使用
),你也可以使用
fileno${^LAST\u FH}
。这是Linux兼容的,而不是Unix兼容的。
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};
}
my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");