Hintergrund:
Perl wurde ursprünglich als Mittel zur effizienten Verarbeitung von Textströmen entwickelt, weshalb die Mechanismen für Eingabe/Ausgabe (I/O) zu den ausgereiftesten im Kern der Sprache gehören. Mit der Entwicklung von Unicode und dem Auftreten verschiedener Eingabe-/Ausgabeschichten ist die Aufgabe der richtigen Auswahl der Kodierung und des Managements der Streams relevant geworden, um Datenverlust oder -beschädigung zu vermeiden.
Problem:
Eine falsch gewählte Kodierung beim Lesen/Schreiben von Dateien führt zu Datenverzerrungen (insbesondere bei nationalen Zeichen), und Fehler bei der Verarbeitung von Streams (z. B. unüberprüfte Erfolgsmeldungen beim Öffnen von Dateien) sind häufig die Ursache für Bugs und Sicherheitsanfälligkeiten.
Lösung:
Zum Öffnen von Dateien wird open mit der dreistelligen Argumentsyntax verwendet, die sicherer und universeller ist (vermeidet Sicherheitsanfälligkeiten durch die Interpretation von Pfaden und Modi). Für die korrekte Interaktion mit Kodierungen kommen Schichten zum Einsatz (z. B. "<:encoding(UTF-8)"). Es ist notwendig, immer den Erfolg des Öffnens/Schließens zu überprüfen und die erforderlichen Arbeitsmodi explizit festzulegen.
Beispiel:
open my $fh, '<:encoding(UTF-8)', $filename or die "Kann $filename nicht öffnen: $!"; while (my $line = <$fh>) { chomp $line; # entfernt Zeilenumbrüche print "$line\n"; } close $fh or warn "Kann $filename nicht schließen: $!";
Wichtige Merkmale:
open (open my $fh, '<', $file)Kann man Benutzereingaben ohne Überprüfung direkt in open übergeben?
Antwort: Nein! Das führt zu Sicherheitsanfälligkeiten (z. B. Ausführung von Shell-Befehlen bei unsicheren Aliassen) und Fehlern bei der Arbeit mit Pfaden. Verwenden Sie die explizite dreistellige Argumentsyntax.
Was passiert, wenn man keine Kodierungsschicht angibt und die Datei im UTF-8-Format vorliegt?
Antwort: Perl wird versuchen, die Bytes als latin1 zu interpretieren, was zu verzerrten Zeichen beim Ausgeben/Lesen führen wird, insbesondere wenn nationale Alphabete verwendet werden.
Reicht es aus, einfach close aufzurufen, um sicherzustellen, dass die Datei korrekt geschrieben wurde?
Antwort: Nein. Nach close muss der Rückgabewert überprüft werden. Wenn ein Schreibfehler aufgetreten ist, wird Perl nur über $! nach einem fehlgeschlagenen close informieren. Zum Beispiel:
close $fh or die "Schreiben fehlgeschlagen: $!";
open ("file.txt")open/close (Arbeiten „ins Blaue“)Ein Log-Handler liest eine Datei über open FILE, "file.txt", überprüft den Erfolg nicht, verarbeitet die Daten byteweise — in der Folge verwandeln sich kyrillische Zeichen in Kauderwelsch, einige Zeilen gehen verloren.
Vorteile:
Nachteile:
Die gesamte Arbeit mit Dateien erfolgt über dreistellige open-Befehle mit Angabe der Kodierung. Alle Fehler werden verarbeitet und protokolliert, die resultierenden Daten sind immer korrekt für die Locale.
Vorteile:
Nachteile: