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

22
open(my $fh, '>', $path) || die $!;
my_sub($fh);

我的_sub()函数能否从$fh中推断出$path路径?

3个回答

17

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

如果您想将句柄与代码打开的路径关联起来,请使用哈希和 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};
}

谢谢。不是我想听到的,但这是更有效的解决办法。 - sh-beta

8

如果有人正在寻找从文件句柄或文件描述符中查找文件名的更好方法:

我更倾向于使用find -inum命令来查找,如果可用的话。 或者,考虑以下方式,总是- 除了Unix / Linux兼容性外,是否存在任何缺点!

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

如果您没有文件句柄(例如,您正在使用<>),则还可以使用fileno ${^LAST_FH} - Adam Katz
1
这是兼容Linux的,而不是通常的Unix兼容。 - tripleee

6
你可以在文件句柄上调用statIO::Handle::stat - 这将为您提供已打开文件的设备和inode。通过这个和一些操作系统技巧,您可以找到文件名。好吧,也许需要很多操作系统技巧。
find命令有一个-inum选项,可以查找具有指定inode号的文件。这可能不如在打开文件时缓存路径那样高效,就像gbacon建议的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接