🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.perl
2 messages
2 total messages Started by Emil Stepniewski Wed, 26 Feb 1997 20:04
Sortowanie po polsku
#91
Author: Emil Stepniewski
Date: Wed, 26 Feb 1997 20:04
27 lines
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
#92
Author: Piotr Piatkowski
Date: Wed, 26 Feb 1997 22:21
54 lines
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