Zum Inhalt springen

Perl, RegEx und der russische Zeichensatz


Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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...

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...