[Vienna-pm] locales, umlaute, sortierung ...

peter pilsl pilsl at goldfisch.at
Wed Nov 10 13:10:06 PST 2010


vielen dank nochmals allen für eure Hilfe.

Ich bin wesentlich weitergekommen seither (und auch wieder nicht :) ) 

Unicode::Collate (Danke an Lars für den Hinweis) ist ein sehr mächtiges Modul und erlaubt der ProgrammierIn weitgehenden Einfluss auf die Sortierung.

Darunter eben auch die Frage was mit Whitespaces zu passieren hat. In Unicode-sprache sind das "variables".

Mein Problem kann also elegant wie folgt gelöst werden:  Ich benutze dabei Unicode::Collate::Locale, das die Angabe von diversen locales ermöglicht.

use Unicode::Collate::Locale;
my $coll= Unicode::Collate::Locale->new(
        level => 3,
        variable => 'Non-Ignorable',
        locale => 'de',
    );
my @l1=$coll->sort(@s);

level=>3 bedeutet dass Casesensitive sortiert wird und das 'Non-Ignorable' bedeutet eben dass meine Leerzeichen nicht ignoriert werden dürfen.

Das Ergebnis ist wie gewünscht, aber leider schon bei einer minimalen Anzahl von Strings sehr langsam.  Das Sortieren von 14 strings dauert bei mir 0.4 sekunden und 32000 strings dauern unglaubliche 2 Sekunden.

Im Vergleich dazu: "Meine" Methode, wo ich vorher alle Leerzeichen durch "0000000000000" ersetze und dann sortiere liefert das exakt gleiche Ergebnis und benötigt für 32000 strings nur 0.16 sekunden, was schon schlicht und einfach Welten schneller ist.

Ich bin damit zufrieden derweil. Ich hab eine schöne Methode gefunden und eine Schnelle :)

Falls es wen interessiert - anbei das script, welches mit beiden Methoden sortiert, die Zeit misst und dann noch prüft ob eh beide sortierungen das gleiche Ergebnis gebracht haben.


# perl -CO sort6.pl
sort 32000 strings
time with Unicode::Collate::Locale : 2.001825
time with tricked sort : 0.164595
comparison revealed 0 differences


lg
peter

ps: falls wem ein schöneres map-statement in zeile 39 einfällt: bitte mir mitteilen. 

my @sd=map { my $x=$_;$x=~s/\s/00000000000000000000000/; $x } @s;




----- Ursprüngliche Mail -----
> hallo,
> 
> tja ... irgendwie dachte ich dass diese Probleme jahrelang hinter mir
> liegen ... aber nun steh ich wieder dort:
> 
> ich schaffs nicht, eine liste von wörtern lexigraphisch korrekt zu
> sortieren.
> 
> ----------------------
> #!/usr/bin/perl -w
> 
> use strict;
> use locale;
> use POSIX qw(locale_h);
> setlocale(LC_ALL, "de_AT.UTF-8");
> 
> my @l;
> @l=qw(ampel ampele ösen zöse ampez ampex);
> push(@l,"ampel vorrang","öse nöse","Öse nöse","ampe wampe"," sowas");
> 
> @l=map {lc($_)} @l;
> 
> @l=sort {$a cmp $b} @l;
> 
> print join("\n", at l),"\n";
> --------------------------
> 
> 
> mein ergebnis:
> 
> ampel
> ampele
> ampel vorrang
> ampe wampe
> ampex
> ampez
> ösen
> öse nöse
> Öse nöse
> sowas
> zöse
> 
> das ist offensichtlich falsch. Erstens wird das grosse "Ö" nicht
> kleingemacht und zweitens sollte das leerzeichen noch vor dem a kommen
> und nicht irgendwo zwischen l und x :)
> 
> locales sind immer schwierig. Aber ich glaub ich hab alles richtig
> gemacht. die locales sind auf den test-systemen installiert (prüfen
> mit "locale -a", erzeugen mit locale-gen) und auch die
> environment-variablen LANG,LC_ALL,LC_COLLATE,LC_CTYPE sind richtig
> gesetzt obwohl das glaub ich ned nötig ist, weil ich eh die
> POSIX-locales im script nehm.
> 
> getestet hab ich das auf insgesamt vier Rechnern. zwei mit perl 5.8.8
> und zwei mit perl 5.10.1 (alles ubuntu: 8.04, 9.04, 10.04 u 10.10)
> 
> ich hab auch alle möglichen utf8::encode und utf8::decode und das
> umwandeln auf latin1 vor dem sortieren und rückwandeln auf utf8
> nachher probiert. hat alles ned funktioniert.
> 
> was überseh ich? kann das wer auf einem anderen system als ubuntu
> testen? danke & danke für tips,
> peter
> 
> 
> 
> _______________________________________________
> Vienna-pm mailing list
> Vienna-pm at pm.org
> http://mail.pm.org/mailman/listinfo/vienna-pm
-------------- next part --------------
A non-text attachment was scrubbed...
Name: sort6.pl
Type: application/x-perl
Size: 1188 bytes
Desc: not available
URL: <http://mail.pm.org/pipermail/vienna-pm/attachments/20101110/9177ed6a/attachment.bin>


More information about the Vienna-pm mailing list