open(my $fh, '>', $path) || die $!;
my_sub($fh);
Может my_sub () так или иначе экстраполируют $path от $fh?
Дескриптор файла может быть даже подключен не к файлу, а к сетевому сокету или каналу, подключенному к стандартному выходу дочернего процесса.
Если вы хотите связать дескрипторы с путями, открываемыми вашим кодом, используйте хэш и оператор 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};
}
Вы можете вызвать stat
или IO::Handle::stat
на файловом хэндле - это даст вам устройство и inode файла, который вы открыли. С помощью этого и небольшого мастерства операционной системы вы сможете найти имя файла. Хорошо, может быть, с помощью многих операционных систем.
Команда find
имеет опцию -inum
для поиска файла с указанным номером inode. Это, вероятно, будет не так эффективно, как кэширование пути при открытии файла, как рекомендует gbacon.