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

sh-*_*eta 20 perl filenames filehandle

open(my $fh, '>', $path) || die $!;
my_sub($fh);
Run Code Online (Sandbox Code Playgroud)

my_sub()能以某种方式从$ fh推断出$ path吗?

Gre*_*con 16

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

如果要将句柄与代码打开的路径相关联,请使用哈希和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};
}
Run Code Online (Sandbox Code Playgroud)


小智 7

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

如果可以的话,我更愿意使用find -inum.或者,如何使用以下方式,总是 - 任何缺点,除了兼容unix/linux!

my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
Run Code Online (Sandbox Code Playgroud)


mob*_*mob 6

您可以调用statIO::Handle::stat在文件句柄上调用- 这将为您提供已打开文件的设备和inode.有了这个和一点操作系统的魔法,你可以找到文件名.好的,可能是很多操作系统的魔法.


find命令具有-inum查找具有指定inode编号的文件的选项.正如gbacon建议的那样,当你打开文件时,这可能不如缓存路径那么有效.