Tach!
Das Beispiel beginnt nach dem üblichen Einbinden von strict und warnings mit dem Laden des utf8-Moduls, das einzig dem Zweck dient, Perl mitzuteilen, dass der Sourcecode in utf-8 geschrieben ist.
Das ist nicht richtig. utf8 ist ein Pragma was bewirkt, dass der Interpreter die im Script notierten Literale als "utf-8-kodierte Zeichenketten" betrachtet und nicht als Bytesequenzen.
"The use utf8 pragma tells the Perl parser to allow UTF-8 in the program text in the current lexical scope. The no utf8 pragma tells Perl to switch back to treating the source text as literal bytes in the current lexical scope. [...] Do not use this pragma for anything else than telling Perl that your script is written in UTF-8." sagt Perldoc. Und weiterhin:
"Bytes in the source text that are not in the ASCII character set will be treated as being part of a literal UTF-8 sequence. This includes most literals such as identifier names, string constants, and constant regular expression patterns."
Ich kann nicht erkennen, warum der oben zitierte Satz nicht richtig sein soll - größtenteils jedenfalls. Geht es lediglich darum, dass das Wort Modul falsch ist? Ist er mit dem Ändern in die Formulierung "mit dem Setzen des utf8-Pragmas" korrekter?
Die folgende Zeile binmode STDOUT, ":utf8" sorgt dafür, dass auch die Ausgabe in utf-8 erfolgt. Ohne diese Zeile könnten Umlaute als Fragezeichen oder ähnliches ausgegeben werden.
Auch falsch. Diese Zeile sorgt dafür, dass eben keine utf-8-kodierte Zeichenketten nach STDOUT geschickt werden sondern Bytesequenzen.
Verstehe ich nicht den Einwurf.
"To output UTF-8, use the :encoding or :utf8 output layer. Prepending binmode(STDOUT, ":utf8"); to this sample program ensures that the output is completely UTF-8, and removes the program's warning." sagt Perldoc.
Was wird denn für ein "häh?" ausgegeben, wenn nicht 68 c3 a4 68 3f? Verstehst du unter "utf-8-kodierte Zeichenketten" etwas anderes als die gemäß UTF-8-Kodierungsvorschrift in Bytes umgewandelten Unicode-Codepoints der jeweiligen Zeichen?
dedlfix.