Storia della domanda:
Perl è stato originariamente progettato come strumento per l'elaborazione efficace dei flussi di testo, il che rende i meccanismi di input/output (I/O) tra i più raffinati nel nucleo del linguaggio. Con lo sviluppo di Unicode e l'emergere di diversi strati di input/output, è diventato rilevante scegliere correttamente la codifica e gestire i flussi per evitare la perdita o il danneggiamento dei dati.
Problema:
Una codifica scelta in modo errato durante la lettura/scrittura di file porta a distorsioni dei dati (specialmente con caratteri nazionali), e errori nella gestione dei flussi (ad esempio, il mancato controllo dell'apertura riuscita dei file) diventano spesso causa di bug e vulnerabilità.
Soluzione:
Per aprire file si utilizza open con una sintassi a tre argomenti, che è più sicura e universale (evita vulnerabilità nell'interpretazione dei percorsi e dei modi). Per interagire correttamente con le codifiche si utilizzano strati (ad esempio, "<:encoding(UTF-8)"). È sempre necessario controllare il successo dell'apertura/chiusura e specificare esplicitamente i modi di lavoro necessari.
Esempio:
open my $fh, '<:encoding(UTF-8)', $filename or die "Cannot open $filename: $!"; while (my $line = <$fh>) { chomp $line; # rimuove il carattere di nuova linea print "$line "; } close $fh or warn "Cannot close $filename: $!";
Caratteristiche chiave:
È possibile passare l'input dell'utente direttamente in open senza verifica?
Risposta: No! Questo porta a vulnerabilità (ad esempio, l'esecuzione di comandi shell in caso di alias non sicuri) e errori nel lavoro con i percorsi. Utilizzare sempre una sintassi a tre argomenti esplicita.
Cosa succede se non viene specificato uno strato di codifica e il file è in UTF-8?
Risposta: Perl tenterà di interpretare i byte come latin1, il che porterà a caratteri distorti durante l'output/lettura, specialmente se vengono utilizzati alfabeto nazionali.
È sufficiente semplicemente chiamare close per assicurarsi che il file venga scritto correttamente?
Risposta: No. Dopo close, è necessario controllare il valore di ritorno. In caso di errore di scrittura, Perl lo segnalerà solo tramite $! dopo un close non riuscito. Ad esempio:
close $fh or die "Write failed: $!";
Un gestore di log legge un file tramite open FILE, "file.txt", non verifica il successo, elabora i dati byte per byte – di conseguenza, i caratteri cirillici si trasformano in un abominio, alcune righe vengono perse.
Pro:
Contro:
Tutta l'elaborazione dei file avviene tramite open a tre argomenti con specifica della codifica. Tutti gli errori vengono gestiti e registrati, i dati risultanti sono sempre corretti per la località.
Pro:
Contro: