Versuch, die Encode :: decode Warnmeldung zu verbessern: Segfault in $ SIG {__ WARN__} -Handler

9

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:

%Vor%

Ausgabe:

%Vor%     
Håkon Hægland 28.12.2016, 11:14
quelle

1 Antwort

1

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). Das    sysread layer führt implizit den Layer :encoding(...) ein.   Siehe :utf8 , binmode und% open pragma.

    
zdim 29.12.2016 10:14
quelle

Tags und Links