Thread Wirksamkeit von perl -CSD
(4 answers)
Opened by jonboy at 2009-01-14 18:35
Hallo liebe Community,
vielleicht ist die Sache ja ganz einfach, aber ich stehe hier ein bisschen wie die Kuh vorm Berg. Es geht darum, dass ich Dateien einlesen und dabei automatisch durch den :utf8-Layer geschickt haben will. An sich kein Problem - solange ich selbst die fraglichen Dateien öffne, denn sobald ich das durch ein anderes Modul lasse (konkret mittels slurp() aus IO::Util), wirkt der Layer offensichtlich nicht mehr. So wie ich das verstanden habe, greift die Definition per "use open ':utf8';" nur innerhalb des aktuellen lexical scope, der maximal die eigene Scriptdatei umfasst, sich aber nicht auf andere Module auswirkt. Aus diesem Grund schalte ich den :utf8-Layer mittels "perl -CSD" ein, weil das das "globalste" ist, was mir dazu eingefallen ist. Nun habe ich das Problem mal auf minimalen Beispielcode reduziert. Erstens habe ich eine Datei mit dem String "äöüÄÖÜß" in UTF-8-kodierter Form, wie man nicht zuletzt an der Dateigröße leicht erkennen kann, die nicht 8, sondern 17 Bytes beträgt: Das Testscript sieht so aus: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/perl -w -CSD use strict; use TestUnicodeModule; print "unicode pragma in test-unicode: " . ${^UNICODE} . "\n"; open (F, 'unicodetest'); my $out = <F>; close (F); print "out: " . $out . "\n"; print "out is_utf8: " . ( utf8::is_utf8($out) ? 1 : 0 ) . "\n"; print "out length: " . length($out) . "\n"; Wie man sieht, binde ich noch das Modul TestUnicodeModule mit ein. Das macht eigentlich genau das gleiche, nur eben halt in einem ausgelagerten Modul. Der Vollständigkeit halber: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 package TestUnicodeModule; print STDERR "unicode pragma in TestUnicodeModule: " . ${^UNICODE} . "\n"; open (F, 'unicodetest'); my $out = <F>; close (F); print "out: " . $out . "\n"; print "out is_utf8: " . ( utf8::is_utf8($out) ? 1 : 0 ) . "\n"; print "out length: " . length($out) . "\n"; Nun führe ich das Script aus und versteh's einfach nicht: Code: (dl
)
1 $ ./test-unicode Laut man perlvar gibt ${^UNICODE} die derzeitigen Unicode-Einstellungen von Perl wieder, und man sieht, dass diese auch im TestUnicodeModule gelten. Trotzdem (und obwohl ich dem open keinerlei Layer mitgebe, die den Default überschreiben könnten) wird die Datei nur im Script mit korrektem Layer eingelesen, im Modul aber nicht, obwohl doch (für mein Empfinden) perl -CSD diese Einstellung doch eigentlich global ändern sollte. Der springende Punkt ist, dass ich das Modul selbst idealerweise nicht ändern will (weil es hier um fertige CPAN-Module geht - wie gesagt, konkret um IO::Util) und hierfür sozusagen die sauberste, "richtigste" Lösung suche. Über Hilfestellungen oder Fingerzeige auf Dokumentation, die mir bisher dann offenkundig verborgen geblieben ist, freue ich mich sehr. Viele Grüße, Jonas |