perl file-io filehandle

¿Cómo puedo verificar si un filehandle está abierto en Perl?



file-io (6)

¿Por qué querrías hacer eso? La única razón por la que puedo pensar es cuando está usando manejadores de archivos del paquete de estilo antiguo (que parece que está haciendo) y desea evitar accidentalmente guardar un identificador sobre otro.

Ese problema se puede resolver utilizando nuevos manejadores de archivos indirectos de estilo.

open my $fh, ''<'', $filename or die "Couldn''t open $filename: $!";

Esta pregunta ya tiene una respuesta aquí:

¿Hay alguna manera de verificar si un archivo ya está abierto en Perl? Quiero tener acceso a un archivo de lectura, por lo que no es necesario un flock .

open(FH, "<$fileName") or die "$!/n" if (<FILE_IS_NOT_ALREADY_OPEN>); # or something like close(FH) if (<FILE_IS_OPEN>);


¿Por qué te importa si ya está abierto? ¿Estás tratando de atrapar lecturas simultáneas?

Realmente no necesita preocuparse por cerrar el archivo. O no está abierto y el cierre falla porque no tiene nada que cerrar, o el archivo está abierto y el cierre lo libera. De cualquier manera, el archivo no está abierto en ese identificador de archivo. Simplemente cierre el identificador de archivos sin preocuparse si no está abierto. ¿Estás viendo algo raro allí?


Consulte la respuesta sobre openhandle() de Scalar::Util . La respuesta que originalmente escribí aquí fue una vez lo mejor que pudimos hacer, pero ahora está muy desactualizada.


El módulo Scalar::Util proporciona la función openhandle() para esto. A diferencia de fileno() , maneja los manejadores de archivos perl que no están asociados con las manetas de fileno() sistema operativo. A diferencia de tell() , no produce advertencias cuando se usa en un archivo filehandle sin abrir De la openhandle() del módulo:

Openhandle FH

Returns FH if FH may be used as a filehandle and is open, or FH is a tied handle. Otherwise "undef" is returned. $fh = openhandle(*STDIN); # /*STDIN $fh = openhandle(/*STDIN); # /*STDIN $fh = openhandle(*NOTOPEN); # undef $fh = openhandle("scalar"); # undef


Perl proporciona la función fileno() para exactamente este propósito.

EDITAR Me corresponde corregido en el propósito de fileno() . Prefiero la prueba más corta

fileno FILEHANDLE

encima

tell FH != -1


Tell produce una advertencia (al igual que stat, -s, -e, etc.) con use warnings (-w)

perl -wle '' open my $fh, "<", "notexists.txt"; print "can stat fh" if tell $fh '' tell() on closed filehandle $fh at -e line 1. -1

Las alternativas fileno($fh) y eof($fh) no producen advertencias. Encontré que la mejor alternativa era guardar la salida de open .