In Perl, per lavorare con i file si utilizza l'apertura dei descrittori tramite open. Oltre ai descrittori standard (STDIN, STDOUT, STDERR), è possibile crearne di propri e gestirli.
Perl utilizza il concetto di strati di input-output (:encoding, :utf8, :raw, ecc.) per gestire correttamente diversi tipi di file e codifiche. Per impostazione predefinita, Perl può lavorare in modalità testo (con conversione delle righe) o binaria.
open my $fh, '<:encoding(UTF-8)', 'file.txt' or die $!; while (my $line = <$fh>) { print $line; } close $fh;
open my $fh, '<:raw', 'image.bin' or die $!; read($fh, my $data, -s 'image.bin'); close $fh;
La scelta corretta dello strato (:raw per binari, :encoding(NAME) per testuali) garantisce lettura e scrittura corrette.
Se si apre un file utilizzando la costruzione
open FH, '<', $filee si leggono dati binari, otterremo sempre un risultato corretto?
Risposta: No! Senza specificare :raw, Perl su alcune piattaforme modificherà automaticamente i caratteri di fine riga (ad esempio, CRLF → LF su Windows). Per leggere file binari, utilizzare sempre la modalità :raw:
open my $fh, '<:raw', 'file.bin';
Storia
In un progetto aziendale, gli sviluppatori lavoravano con registri di testo, considerando le righe senza specificare una codifica. Di conseguenza, i registri in UTF-8 a volte si "rompevano" - il file read veniva corrotto durante la lettura dei caratteri cirillici, poiché Perl interpretava erroneamente i byte. L'errore è stato risolto solo dopo aver aggiunto esplicitamente lo strato
:encoding(UTF-8)nella chiamataopen.
Storia
Su Windows, durante la copia di file binari, leggevano i dati utilizzando
open FH, '<', 'binfile.dat'e scrivevano senza specificare la modalità. Il programma "rompeva" le immagini, poiché nel flusso di conversione le righe CRLF venivano cambiate in LF, causando dati binari non validi. Lo strato:rawha risolto il problema.
Storia
In un'API esterna era richiesta l'output di STDOUT solo in UTF-8, mentre i programmatori utilizzavano
binmode STDOUT, ':encoding(UTF-8)', il problema è scomparso.