In Perl, i descrittori di file (filehandles) sono oggetti speciali (variabili globali o lessicali) associati a un file fisico o virtuale. È molto importante aprire, verificare e chiudere correttamente i file per prevenire perdite di risorse e violazioni di sicurezza.
Esempio di lavoro corretto:
open my $fh, '<', 'myfile.txt' or die "Impossibile aprire il file: $!"; while (my $line = <$fh>) { print $line; } close $fh or warn "Impossibile chiudere il file: $!";
Sfumature:
open my $fh, ...). I descrittori globali (OPEN FILE, ...) sono considerati obsoleti.or die/or warn.close e gestire eventuali errori.binmode $fh.Qual è la differenza tra la costruzione
open FH, ...eopen my $fh, ..., e perché si raccomanda di utilizzare la seconda opzione?
Risposta: La costruzione open my $fh, ... crea un descrittore di file lessicalmente limitato, il che significa che funziona solo all'interno del blocco/programma corrente e viene distrutto automaticamente al di fuori dell'ambito. Questo previene la sovrapposizione accidentale dei descrittori, protegge dai conflitti di nome dei filehandles globali e aumenta l'affidabilità.
open FH, '<', 'file.txt'; # Descrittore globale! Si raccomanda di evitarlo. open my $fh, '<', 'file.txt'; # Lessicale, sicuro.
Storia
In un grande progetto, si permetteva l'uso di descrittori globali identici (OPEN LOG, ...). Di conseguenza, le richieste parallele scrivevano accidentalmente in file sbagliati, portando a perdite o mescolanze di log.
Storia
Un sviluppatore ha dimenticato di verificare il successo dell'apertura del file; di conseguenza, se il file non esisteva, l'errore veniva registrato in un altro posto (ad esempio, i log venivano scritti nel posto sbagliato, si cancellavano file altrui, ecc.).
Storia
La mancanza della chiamata a close portava all'esaurimento dei descrittori sul server durante l'elaborazione di massa dei file — il server iniziava a "bloccarsi" e crollava con enormi volumi di dati.