bloodybastard Geschrieben 22. November 2004 Teilen Geschrieben 22. November 2004 Hallo. Ich habe ein nettes kleines Problem zu Perl, RegEx und anderen Zeichensätzen. Hier erstmal die Ausgangssituation : In einer Text - Datei befinden sich russiche Texte (kein Unicode). Diese Texte sollen über einen RegEx Zeilenweise durchsucht werden, wobei Groß- und Kleinschreibung ignoriert werden ( Flag i am Ende der RegEx). Das Problem ist nun das Perl trotzdem zwischen Groß- und Kleinschreibung unterscheidet, obwohl die local - Settings für den Nutzer auf die entsprechenden Zeichensätze für POSIX gesetzt wurden und der RegEx wie oben beschrieben das Flag i hat. Perl Interpreter liegt in der Version 5.8.5 vor, System ist FreeBSD 4.7. Hat jemand von euch eine Idee, woran es liegen könnte? Vielen Dank schon mal im Voraus, BB Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dummabua Geschrieben 23. November 2004 Teilen Geschrieben 23. November 2004 hidiho, nach was willst du den Text dann jetzt dursuchen? nach den russischen zeichen oder nach nicht russischen Zeichen? PS: evtl hilfreich -> http://search.cpan.org/~farber/Lingua-RU-Charset-0.02/ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bloodybastard Geschrieben 23. November 2004 Autor Teilen Geschrieben 23. November 2004 Hallo dummabua. Also gesucht wird nach russischen Zeichen. Wobei der RegEx das Wort findet, aber wie besagt zwischen Groß- und Kleinschreibung unterscheidet. Was deinen Link angeht, kann der mir leider nicht helfen, da der RegEx sich in einer Fremdsoftware befindet. In der Software wird mit use locale geabreitet. Grüße, BB Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dummabua Geschrieben 23. November 2004 Teilen Geschrieben 23. November 2004 hmmm versteh ich jetzt irgendwie nicht Also ihr habt eine Software unter BSD laufen, die mit PERL RegEx arbeitet. Kannst aber keine weiteren Module installieren? Oder: Ihr habt eine Software laufen, die mit diesem russischen Texten nichts anfangen kann und darum willst du mit dem PERL 5.8, der beim BSD dabei war ein eigenes Script schreiben, mit dem du den Text bearbeiten kannst, bevor das eigentliche Proggy damit was machen soll. Also eigentlich sollte, wenn der Pattern Modifier "/i" richtig eingesetzt wird, die Suche non-case-sensitive sein. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bloodybastard Geschrieben 23. November 2004 Autor Teilen Geschrieben 23. November 2004 Hmm ok, fang ich am besten mal von vorn an. Fakten : Perl in Version 5.8.5 liegt vor FreeBSD in Version 4.7 Bei der Software handelt es sich um ein Shop - Sytsem, das mit Perl zusammenarbeitet, bzw. dessen Module zum Teil in Perl geschrieben wurden. Das Shop - Sytsem verwendet für die Suche nach Artikelinformationen einen RegEx und hängt ein i an den Ausdruck, wenn die Suche Groß- und Kleinschreibung ignorieren soll. Der RegEx wird dann zusammen mit einem use locale in einem eval - Block hinterlegt. Folglich sollte man das Verhalten der Suche mit einem eigenen RegEx nachbilden können und die selben Ergebnisse erhalten. Beispiel - Skript : --snip-- #!/usr/bin/perl use locale; my $file = '/data/foo.txt'; my $pushkin_small = 'ïóøêèÃ'; my $pushkin_normal = 'ÃóøêèÃ'; my $data = LoadFile($file); my $count_normal = 0; my $count_small = 0; foreach my $line (@{$data}) { $count_normal++ if ($line =~ /$pushkin_normal/isg); $count_small++ if ($line =~ /$pushkin_small/isg); } print "Match for small : $count_small\n"; print "Match for normal : $count_normal\n\n"; exit(0); sub LoadFile { my $file = shift(@_); my @value = (); open(FILE, "<$file"); @value = <FILE>; close(FILE); chomp(@value); return \@value; } --snap-- Anmerkung : LC_CTYPE und LC_COLLATE sind auf ru_RU.KOI8-R gesetzt Gehen wir mal davon aus das das Wort Pushkin in 30 Zeilen der Datei /data/foo.txt vorkommt, so müßte mir als Ergebnis für beide Zähler jeweils 30 rauskommen. In wirklichkeit erhalte ich ein Ergebnis das wie folgt aussieht : Match for small : 9 Match for normal : 30 Die Frage ist jetzt, ob die Ursache des Problems bei Perl, oder im OS zu suchen ist. Grüße, BB P.S.: Ich habe das ganze auch auf ein FreeBSD 4.10 getestet, mit dem gleichen Ergebnis. Laut Aussagen eines der Beteiligten lief das ganze bereits mal unter FreeBSD 4.7 ohne Fehler. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dummabua Geschrieben 23. November 2004 Teilen Geschrieben 23. November 2004 hmmm was mir jetzt ins auge gestochen ist (muss dazu sagen, dass ich auch kein Perl Meister bin ) is das "g" als modifier. Laut meinem Perl Buch, kannst du diesen Modifier (g = globale suche) nur verwenden, wenn du nicht =~ /$pushkin_normal/isg sondern =~ m/$pushkin_normal/isg schreibst. Versuch das bitte mal, dass wär jetzt mal das erste... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
bloodybastard Geschrieben 23. November 2004 Autor Teilen Geschrieben 23. November 2004 Das m liegt im Orginal - Quellcode des Shop - Sytsems vor, daran sollte es also nicht liegen. Bei einem Test eben ist aber noch ein weiterer Fehler aufgetreten. lc und uc verhalten sich genau anders herum, gleiches gilt auch für ucfirst und lcfirst. Laut der locale Dokumentation von Perl ist hier bei FreeBSD die Variable LC_CTYPE verantwortlich dafür. Ich denke dort ist der Fehler zu suchen. Grüße, BB Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.