Это не может быть сделано вообще (переносимо), † , что понятно, поскольку дескриптор «файла» вообще не должен быть связан с файлом.Вы можете записать fileno для каждого дескриптора файла.
Таким образом, при открытии файла
my %filename_fileno;
open my $fh, '>', $file or die "Can't open $file: $!";
$filename_fileno{fileno $fh} = $file;
, а затем вы можете просмотреть его при необходимости ‡
say "Filename is: ", $filename_fileno{fileno $fh};
Не забудьтеудалить запись из хэша, когда этот файл (должен быть) закрыт
delete $filename_fileno{fileno $fh};
close $fh;
Так что это должно быть в служебных функциях.Учитывая, что требуется больше внимания, как указано в сноске ‡ , в целом это могло бы стать хорошим маленьким модулем.Тогда можно также рассмотреть возможность расширения (наследования) от связанного модуля, например Path :: Tiny .
Примечание. Вы не можете записывать в файл из отдельных файловых дескрипторов, подобных этому.Операции над каждым файловым дескриптором отслеживают, где этот файловый дескриптор был последним в файле, таким образом, записи будут блокировать промежуточные записи другим файловым дескриптором.
Примечание: Используйте лексические файловые дескрипторы (my $fh
) ине globs (FH
), используйте три аргумента open
, и всегда проверяйте open
call .
† В некоторых(большинство?) систем Linux, которые вы можете использовать /proc
файловая система
say readlink("/proc/$$/fd/" . fileno $fh);
, и на более (всех?) системах Unix-y можно использовать номер (устройства и) индекса
say for (stat $fh)[0,1];
‡ Ссылки, как мягкие (символические), так и жесткие, могут использоваться для изменения данных и иметь разные названия.Таким образом, мы можем иметь разные имена файлов, но один и тот же файл (данные).
В системах Windows лучший способ проверки представлен в этом посте , за исключением случая с жесткой связью, для которого нужно было бы использовать метод другого ответа (вывод разбора), посколькуЯ могу сказать.
Кроме того, неканонические имена, а также различные заглавные буквы (в системах без учета регистра), короткие / длинные имена в некоторых системах (больше?) ... могут использоваться для разных имен длятот же файл.Это легче очистить, используя модули, но также необходимо добавить.
В большинстве (всех?) Других систем понятие inode и любая доступная stat
-подобная функциональность делает ихпроблема, так как устройство + inode относится исключительно к данным.
Благодаря ikegami за комментарии к этому.