open(my $fh, '>', $path) || die $!;
my_sub($fh);
我的_sub()函数能否从$fh中推断出$path路径?
open(my $fh, '>', $path) || die $!;
my_sub($fh);
我的_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");
<>
),则还可以使用fileno ${^LAST_FH}
。 - Adam Katzstat
或IO::Handle::stat
- 这将为您提供已打开文件的设备和inode。通过这个和一些操作系统技巧,您可以找到文件名。好吧,也许需要很多操作系统技巧。
find
命令有一个-inum
选项,可以查找具有指定inode号的文件。这可能不如在打开文件时缓存路径那样高效,就像gbacon建议的那样。