open(my $fh, '>', $path) || die $!;
my_sub($fh);
¿Puede my_sub() de alguna manera extrapolar $ path from $ fh?¿Puedo encontrar un nombre de archivo de un identificador de archivo en Perl?
open(my $fh, '>', $path) || die $!;
my_sub($fh);
¿Puede my_sub() de alguna manera extrapolar $ path from $ fh?¿Puedo encontrar un nombre de archivo de un identificador de archivo en Perl?
Un identificador de archivo puede que ni siquiera esté conectado a un archivo sino a un conector de red o un conducto conectado a la salida estándar de un proceso hijo.
Si desea asociar identificadores con las rutas que abre su código, use un hash y el operador fileno
, , p.,
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};
}
Puede llamar stat
o IO::Handle::stat
en un gestor de archivo - que le dará el dispositivo y i-nodo del archivo que ha abierto. Con eso y un poco de magia del sistema operativo, puedes encontrar el nombre del archivo. OK, tal vez una gran cantidad de magia del sistema operativo.
El comando find
tiene una opción -inum
para encontrar un archivo con un número de i-nodo especificado. Probablemente, esto no será tan eficiente como almacenar en caché la ruta al abrir el archivo, como lo recomienda gbacon.
También una solución válida, aunque lenta (como usted mencionó). –
El que podría estar buscando una mejor manera de encontrar el nombre de archivo de descriptor de gestor de archivo o archivo:
yo preferiría utilizar el hallazgo -inum, si está disponible. O, ¿qué tal el uso de la siguiente manera, siempre - cualquier inconveniente excepto el compatible con unix/linux!
my $filename='/tmp/tmp.txt';
open my $fh, '>', $filename;
my $fd = fileno $fh;
print readlink("/proc/$$/fd/$fd");
También puede usar 'fileno $ {^ LAST_FH}' si no tiene el manejador de archivos a mano (por ejemplo, está usando '<>'). –
Esto es compatible con Linux, generalmente no compatible con Unix. – tripleee
Gracias. No es lo que quería escuchar, sino la solución más eficiente. –
@ sh-beta ¡De nada! Espero que ayude. –