En Perl, los descriptores de archivos (filehandles) son objetos especiales (variables globales o léxicas) que se asocian con un archivo físico o virtual. Es muy importante abrir, verificar y cerrar archivos correctamente para prevenir fugas de recursos y violaciones de seguridad.
Ejemplo de trabajo correcto:
open my $fh, '<', 'myfile.txt' or die "¡No se puede abrir el archivo: $!"; while (my $line = <$fh>) { print $line; } close $fh or warn "¡No se pudo cerrar el archivo: $!";
Detalles:
open my $fh, ...). Los descriptores globales (OPEN FILE, ...) se consideran obsoletos.or die/or warn.close y manejar posibles errores.binmode $fh.¿Cuál es la diferencia entre la construcción
open FH, ...yopen my $fh, ..., y por qué se recomienda usar la segunda opción?
Respuesta: La construcción open my $fh, ... crea un descriptor de archivo lexicalmente limitado, es decir, opera solo dentro del bloque/subprograma actual y se destruye automáticamente fuera del ámbito. Esto previene la sobrescritura accidental de descriptores, protege contra conflictos de nombres de filehandles globales y mejora la fiabilidad.
open FH, '<', 'file.txt'; # ¡Descriptor global! Se recomienda evitarlo. open my $fh, '<', 'file.txt'; # Léxico, seguro.
Historia
En un gran proyecto, se permitía el uso de descriptores globales idénticos (OPEN LOG, ...). Como resultado, solicitudes paralelas escribían accidentalmente en archivos incorrectos, lo que llevaba a la pérdida o mezcla de registros.
Historia
Un desarrollador olvidó verificar el éxito de la apertura del archivo; como resultado, si el archivo no existía, se sobrescribió un error en otro lugar (por ejemplo, los registros se escribían en el lugar incorrecto, se borraban archivos ajenos, etc.).
Historia
La falta de llamada a close conducía al agotamiento de descriptores en el servidor durante el procesamiento masivo de archivos: el servidor comenzaba a "congelarse" y caía con grandes volúmenes de datos.