Ich versuche, die Warnmeldung von Encode::decode()
zu verbessern. Anstatt den Namen des Moduls und die Zeilennummer im Modul auszudrucken, möchte ich den Namen der gelesenen Datei und die Zeilennummer in der Datei ausgeben, in der die fehlerhaften Daten gefunden wurden. Für einen Entwickler kann die ursprüngliche Nachricht nützlich sein, aber für einen Endbenutzer, der mit Perl nicht vertraut ist, ist es wahrscheinlich ziemlich bedeutungslos. Der Endbenutzer würde wahrscheinlich lieber wissen, welche Datei das Problem verursacht.
Ich habe zuerst versucht, dies mit einem $SIG{__WARN__}
-Handler zu lösen (was wahrscheinlich keine gute Idee ist). , aber ich bekomme einen Fehler. Wahrscheinlich ein dummer Fehler, aber ich konnte es nicht herausfinden:
Ausgabe:
%Vor%Hier ist eine andere Möglichkeit, wo die Warnung ausgelöst wird, mit un-gepuffertem% co_de%
%Vor% Die Datei sysread
wurde vom geposteten Programm geschrieben, außer dass ich sie hinzufügen musste, um das Verhalten zu reproduzieren - sie läuft ohne Warnungen auf v5.10 und v5.16. Ich habe test.txt
zum Ende hinzugefügt. Die Zeilennummer kann mit \x{234234}
verfolgt werden.
Das $char =~ /\n/
gibt sysread
bei Fehler zurück. Es kann in den Körper von undef
verschoben werden, damit Lesevorgänge fortgesetzt werden und alle Warnungen abgefangen werden, die bei while (1)
(bei EOF zurückgegeben) ausbrechen.
Dies druckt
%Vor% Während dies den Charakter bemerkt, vor dem gewarnt wird, ist das erneute Lesen der Datei mit 0
möglicherweise besser als das Erreichen von Encode
, insbesondere wenn sysread
sysread
verwendet.
Perl ist jedoch Encode
intern und ich bin mir nicht sicher, ob utf8
sysread
benötigt.
Hinweis. Die Seite für sysread unterstützt die Verwendung von Daten mit Codierungsebenen
Beachten Sie, dass das Dateihandle als
Encode
Unicode markiert wurde Zeichen werden anstelle von Bytes gelesen (LENGTH, OFFSET und Rückgabewert von:utf8
sind Unicode-Zeichen). Dassysread
layer führt implizit den Layer:encoding(...)
ein. Siehe:utf8
,binmode
und%open
pragma.
Tags und Links perl