Странную фигню обнаружил с поведением перловых операторов 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.