Не транслирует

Nov 26, 2008 12:08

Странную фигню обнаружил с поведением перловых операторов s/// и tr/// . Точнее, обнаружил её ещё год назад, но сейчас снова обратил внимание на неё.
Итак, дана строка кириллического текста в UTF-8. Пытаемся делать замены текста с целью транслитерировать. Оператор s/// работает правильно, а вот tr/// выдаёт фигню. Поэтому скрипт, где используются оба этих оператора, выдёт странный результат:Чё
Chyo
Чушь
ChENshEY
Сало
aEaba'aV
Сам скрипт:
#!/usr/bin/perl -wp use strict; $_ = translit($_); =head1 DESCRIPTION Читает текст с STDIN, транслитерирует и выводит в STDOUT. =head1 FUNCTION =head2 translit Транслитерирует русский текст в латиницу =cut sub translit { my $data = shift; my %xlt = qw/ё yo Ё Yo ж zh Ж Zh ц ts Ц Ts ч ch Ч Ch ш sh Ш Sh щ shch Щ Shch ю yu Ю Yu я ya Я Ya/; # Серия замен while( my ($from, $to) = each %xlt) { $data =~ s/$from/$to/; } # foreach $data =~ tr{абвгдезийклмнопрстуфхъыьэАБВГДЕЗИЙКЛМНОПРСТУФХЪЫЬЭ} {abvgdezijklmnoprstufh'y'eABVGDEZIJKLMNOPRSTUFH'Y'E}; return $data; } # sub translit =head1 AUTHOR Александр Сапожников L =cut
Сам скрипт - в UTF-8, данные в него поступают тоже в UTF-8.

unicode, программизм, perl

Previous post Next post
Up