Hallo.
Meine Frage ist nun, wie ich die Umlaute umgewandelt bekomme. Es handelt sich um eine stinknormale Windows Textdatei, wie man sie z.B. mit Notepad erstellt. Welcher Zeichensatz liegt dem zu Grunde? Am tollsten wäre es natüerlich für mich, wenn use locale und /i funktionieren würden, dann könnte ich mir die ganze Umwandlung in Kleinschreibung sparen.
Ich gehe davon aus, dass sowohl dein Perl Programm, als auch die Textdatei und die Benutzereingaben in ISO-8859-1 vorliegen.
Sofern du beim Schreiben deiner Programme nicht auf UTF-8 (use utf8;
) umsteigen möchtest, dürfte das encoding Pragma (ab perl 5.8.0) dir an dieser Stelle helfen, auch ohne UTF-8 von Perl's Unicode Unterstützung zu profitieren.
Indem du zu Beginn deines Programms use encoding 'iso-8859-1';
nutzt, teilst du perl mit, dass dein Programm den Zeichensatz ISO-8859-1 verwendet und alle Zeichenkettenoperationen (und Ein- und Ausgaben) sich entsprechend zu verhalten haben. Anschließend funktioniert also auch das i-Flag wie gewünscht.
Alles zusammen könnte dann z. B. so aussehen:
use encoding 'iso-8859-1', STDIN => undef, STDOUT => undef;
my $input = 'äöü';
open(my $fh, '<:encoding(iso-8859-1)', 'test.txt') || die $!;
while(<$fh>) {
chomp;
print "Die Benutzereingabe $input ist in Zeile $. ($_) enthalten.\n" if(/$input/i);
}
close($fh);
Wenn die Datei test.txt folgenden Inhalt hat...
äöü
äÖü
ÄÖÜ
... entsteht diese Ausgabe:
Die Benutzereingabe äöü ist in Zeile 1 (äöü) enthalten.
Die Benutzereingabe äöü ist in Zeile 2 (äÖü) enthalten.
Die Benutzereingabe äöü ist in Zeile 3 (ÄÖÜ) enthalten.
Um Probleme mit der Ein- und Ausgabe zu vermeiden, solltest du die Umwandlung für STDIN und STDOUT abschalten (STDIN => undef, STDOUT => undef
). Wenn die Benutzereingabe nicht in ISO-8859-1 vorliegt, musst du sie ggf. noch dekodieren (use Encode;
). Beim Öffnen der Textdatei solltest du einen PerlIO Encoding Layer verwenden, musst du aber nicht zwängsläufig.
Vermutlich ist das alles viel zu kompliziert.
Wenn du eine einfachere Lösung möchtest, kannst du auch eine simple Transliteration durchzuführen, ganz ohne Pragmas und IO-Layer:
$str =~ tr[ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝ]
[àáâãäåæçèéêëìíîïðñòóôõöøùúûüý];
Schöne Grüße.