Thread View: pl.comp.lang.perl
2 messages
2 total messages
Started by Emil Stepniewski
Wed, 26 Feb 1997 20:04
Sortowanie po polsku
Author: Emil Stepniewski
Date: Wed, 26 Feb 1997 20:04
Date: Wed, 26 Feb 1997 20:04
27 lines
1190 bytes
1190 bytes
Czy jest jakies dobry, sprawdzony, najszybszy i w ogole jedynie sluszny
sposob sortowania plikow z polskimi literkami przy pomocy perla?
Konkretnie chodzi mi o sortowanie zwyklych plikow tekstowych.
Swojego czasu ktos zaproponowal mi taki skrypt:
#!/usr/bin/perl
while(<>)
{
chop;
s/±/a~/g; s/æ/c~/g; s/ê/e~/g; s/³/l~/g; s/ñ/n~/g;
s/ó/o~/g; s/¶/s~/g; s/¼/z~/g; s/¿/z~~/g;
push(@slowa,$_);
}
foreach( sort @slowa )
{
s/a~/±/g; s/c~/æ/g; s/e~/ê/g; s/l~/³/g; s/n~/ñ/g;
s/o~/ó/g; s/s~/¶/g; s/z~~/¿/g; s/z~/¼/g;
print "$_\n";
Czy mozna lepiej (szybciej)?
Pozdrawiam
Emil Stepniewski
Re: Sortowanie po polsku
Author: Piotr Piatkowski
Date: Wed, 26 Feb 1997 22:21
Date: Wed, 26 Feb 1997 22:21
54 lines
3099 bytes
3099 bytes
Emil Stepniewski <emil@oeiizk.waw.pl> wrote: : Czy jest jakies dobry, sprawdzony, najszybszy i w ogole jedynie sluszny : sposob sortowania plikow z polskimi literkami przy pomocy perla? Wersja 5.004 (która ciągle się *oficjalnie* nie ukazała) jest już "lokalizowalna" - tzn. można napisać use local żeby perl używał ustawień z locale. Np. tak: #!/usr/bin/perl use locale; @words = qw(lupa łąka laka lądowanie ćma cytryna łóżko zupa żaba); print join ", ", sort @words; Jeżeli teraz mamy zainstalowane locale do języka polskiego i odpowiednio ustawione zmienne środowiskowe, to to działa tak: kompas@zombie3$ echo $LANG pl_PL kompas@zombie3$ ./perlloc ćma, cytryna, lądowanie, laka, łąka, łóżko, lupa, żaba, zupa Przy okazji wychodzi nowy problem, w Polsce mamy dwa standardy... nie, nie kodowania liter, to już wszyscy wiedzą - mamy też dwa standardy sortowania! :-) Ten który widać tu powyżej, to standard stosowany w bibliotekach - przyjmuje się tam że litery "ogonkowe" są rownoważne im odpowiednikom łacińskim, czyli np. w powyższych przykładach słowo "laka" jest za słowem "lądowanie" bo ma trzecią literkę k - drugie litery są traktowane jako identyczne. Podobnie "żaba" i "zupa" - liczy się druga litera. Ale sposób sortowania zależy tutaj już nie od perla, tylko od ustawień systemowych (w tym wypadku jest to AIX 4.2). Myślę że korzysanie z locale jest rozwiązeniem najlepszym, bo mamy problem rozwiązany generalnie, a do tego działają wszystkie funkcje, np: $ perl -Mlocale -e 'print uc "łóżko\n"' ŁÓŻKO Działają też oczywiście poprawnie takie rzeczy jak \w i \b w wyrażeniach regularnych. Werjsa beta perla 5.004 dostępna jest w archiwach CPAN, np. w: ftp://ftp.pk.edu.pl/pub/lang/perl/CPAN/src/5.0/unsupported/ (wbrew temu że nazywa się - najnowsza - 5.003_90 - jest to już 5.004, tylko że pre-release) Swoją drogą to teraz nowa wersja pojawia się średnio raz na tydzień, 5.003_90 pojawiła się ...wczoraj :-) (jeszcze jej nie widziałem) -- Piotr Piątkowski, Uczelniane Centrum Informatyki, AGH Krakow, POLAND
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads