Re: [Comm] Re: Сортировка кириллицы вPerl

Dmitriy Ryzhov =?iso-8859-1?q?dryzhov_=CE=C1_bibirevo=2Enet?=
Сб Июн 21 02:51:29 MSD 2003


Hello Michael,

>> То бишь команда 'use locale' рушит всю работу!!!

MS> Ох... боюсь что вы плохо в этом разобрались.  Даже я в этом плохо
MS> разобрался.  Но у меня когда надо всё работает. :)

Не, ИМХО Perl просто глючит при использовании use encoding (я так
понимаю эта конструкция, как и храниние в определенных случаях
строк в памяти в utf-8, появилась очень недавно).

Все-таки use locale нужно ставить и в случае use encoding, так как она влияет
на порядок сортировки (также, когда и при неиспользовании use encoding), а
тот глюк - это именно глюк, а не неправильное использование директивы

Вот пример:
#!/usr/bin/perl -w

use strict;
use POSIX;
use encoding 'cp1251';

my @l = qw(
        0 1 2 3 4 5 6 7 8 9
        А Б В Г Д Е Ё Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Ы Э Ю Я
        а б в г д е ё ж з и к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
        A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
        a b c d e f g h i j k l m n o p q r s t u v w x y z
);

use locale;
print "$_ " foreach sort(@l); print "\n";
no locale;
print "$_ " foreach sort(@l); print "\n";

use locale;
print("аБвгд" =~ m/б/i? "1": "0", "\n");
print("абвгд" =~ m/б/i? "1": "0", "\n");
print(lc("аБвгд") =~ m/б/? "1":"0", "\n");
no locale;
print("аБвгд" =~ m/б/i? "1": "0", "\n");
print("абвгд" =~ m/б/i? "1": "0", "\n");
print(lc("аБвгд") =~ m/б/? "1":"0", "\n");

Результат:
0 1 2 3 4 5 6 7 8 9 a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y
z Z а А б Б в В г Г д Д е Е ё Ё ж Ж з З и И к К л Л м М н Н о О п П р Р с С т Т у У ф Ф х Х ц Ц ч Ч ш Ш щ Щ ъ Ъ ы Ы ь Ь
э Э ю Ю я Я //по локали, то что нужно (но глючило бы если бы список
был бы типа ("0", "1", ...)
0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x
y z Ё ё А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ
ъ ы ь э ю я //просто сортировка по ord
0 //увы, глючит
0 //увы, глючит
1
1
1
1 //а здесь верно

Результат без use encoding:
0 1 2 3 4 5 6 7 8 9 a A b B c C d D e E f F g G h H i I j J k K l L m M n N o O p P q Q r R s S t T u U v V w W x X y Y
z Z а А б Б в В г Г д Д е Е ё Ё ж Ж з З и И к К л Л м М н Н о О п П р Р с С т Т у У ф Ф х Х ц Ц ч Ч ш Ш щ Щ ъ Ъ ы Ы ь Ь
э Э ю Ю я Я //так же как и с use encoding
0 1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x
y z Ё ё А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ
ъ ы ь э ю я //так же как и с use encoding
1 //верно
1 //верно
1 //верно
0 //без локали не смогла найти букву в другом регистре (а с use
encoding - смогла)
1
0 //без локали не смогла найти букву в другом регистре (а с use
encoding - смогла)

В общем, надо писать в Perl Bug Tracking.

-- 
Best regards,
 Dmitriy Ryzhov                            mailto:dryzhov на bibirevo.net



Подробная информация о списке рассылки community