En Perl, para trabajar con archivos se utiliza la apertura de descriptores mediante open. Además de los descriptores estándar (STDIN, STDOUT, STDERR), se pueden crear y gestionar los propios.
Perl utiliza el concepto de capas de entrada y salida (:encoding, :utf8, :raw, etc.) para manejar correctamente diferentes tipos de archivos y codificaciones. Por defecto, Perl puede trabajar en modo de texto (con conversión de líneas) o binario.
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 elección correcta de la capa (:raw para binarios, :encoding(NAME) para texto) asegura la correcta lectura y escritura.
Si abro un archivo utilizando la construcción
open FH, '<', $filey leo datos binarios, ¿siempre obtendré un resultado correcto?
Respuesta: ¡No! Sin especificar :raw, Perl en algunas plataformas convertirá automáticamente los caracteres de nueva línea (por ejemplo, CRLF → LF en Windows). Para leer archivos binarios, siempre utiliza el modo :raw:
open my $fh, '<:raw', 'file.bin';
Historia
En un proyecto corporativo, los desarrolladores trabajaron con registros de texto, considerando las líneas sin especificar la codificación. Como resultado, los registros en UTF-8 a veces se "rompían" — el archivo read se corrompía al leer caracteres cirílicos, ya que Perl interpretaba incorrectamente los bytes. El error solo se solucionó tras añadir explícitamente la capa
:encoding(UTF-8)en la llamada aopen.
Historia
En Windows, al copiar archivos binarios, leían los datos mediante
open FH, '<', 'binfile.dat'y los escribían sin especificar el modo. El programa "rompía" las imágenes, ya que en el flujo de conversión de líneas CRLF se cambiaba a LF, lo que llevaba a datos binarios no válidos. La capa:rawsolucionó el problema.
Historia
En una API externa, se requería la salida de STDOUT solo en UTF-8, pero los programadores utilizaban
binmode STDOUT, ':encoding(UTF-8)', el problema desapareció.