In Perl wird zur Arbeit mit Dateien die Öffnung von Deskriptoren mit open verwendet. Neben den Standarddeskriptoren (STDIN, STDOUT, STDERR) kann man eigene erstellen und verwalten.
Perl verwendet das Konzept der Ein- und Ausgabeschichten (:encoding, :utf8, :raw usw.), um verschiedene Dateitypen und Codierungen korrekt zu verarbeiten. Standardmäßig kann Perl im Textmodus (mit Zeilenumbruch) oder binär arbeiten.
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;
Die richtige Wahl der Schicht (:raw für Binärdateien, :encoding(NAME) für Textdateien) gewährleistet korrektes Lesen und Schreiben.
Wenn Sie eine Datei mit der Konstruktion
open FH, '<', $fileöffnen und Binärdaten lesen, erhalten wir immer ein korrektes Ergebnis?
Antwort: Nein! Ohne die Angabe :raw wird Perl auf manchen Plattformen die Zeilenumbruchzeichen automatisch umwandeln (z.B. CRLF → LF unter Windows). Verwenden Sie immer den Modus :raw, um Binärdateien zu lesen:
open my $fh, '<:raw', 'file.bin';
Geschichte
In einem Unternehmensprojekt arbeiteten die Entwickler mit Textprotokollen und lasen die Zeilen ohne Angabe der Codierung. Infolgedessen „brachen“ die Protokolle in UTF-8 manchmal – die Datei wurde beim Lesen kyrillischer Zeichen beschädigt, da Perl die Bytes falsch interpretierte. Der Fehler wurde erst nach expliziter Hinzufügung der Schicht
:encoding(UTF-8)beim Aufruf vonopenbehoben.
Geschichte
Unter Windows wurden binäre Dateien beim Kopieren mit
open FH, '<', 'binfile.dat'gelesen und ohne Angabe des Modus geschrieben. Das Programm „brach“ Bilder, da im Zeilenumbruchstrom CRLF in LF umgewandelt wurde, was zu ungültigen binären Daten führte. Die Schicht:rawbehob das Problem.
Geschichte
In einer externen API war die Ausgabe von STDOUT nur in UTF-8 erforderlich, und die Programmierer verwendeten
binmode STDOUT, ':encoding(UTF-8)'war das Problem behoben.