Шаг 105.
Операции с регулярными выражениями. Операция транслитерации
На этом шаге мы рассмотрим операцию транслитерации.
tr/SEARCHLIST/REPLACEMENTLIST/cds
Преобразует каждый символ из списка поиска SEARCHLIST в соответствующий символ из списка замены
REPLACEMENTLIST и возвращает число преобразованных символов. По умолчанию преобразования
осуществляются в строке, задаваемой переменной $_. Как и в рассмотренных на предыдущих шагах операциях
поиска и замены, при помощи операций связывания =~ и !~ можно задать для преобразования строку,
отличную от принятой по умолчанию
$str =~ tr/SEARCHLIST/REPLACEMENTLIST/cds
Списки SEARCHLIST и REPLACEMENTLIST задаются перечислением символов, могут содержать
диапазоны - два символа, соединенных знаком "-", и иметь собственные символы-ограничители, например,
tr (a-j) /0-9/. Операция tr/// имеет синонимичную форму, используемую в потоковом редакторе
sed: y/SEARCHLIST/REPLACEMENTLIST/cds.
Флаги cds имеют следующий смысл.
- с - вместо списка поиска SEARCHLIST использовать его дополнение до основного множества
символов (обычно расширенное множество ASCII).
- d - удалить все символы, входящие в список поиска SEARCHLIST, для которых нет
соответствия в списке замены REPLACEMENTLIST. Если флаг d не установлен и список замены
REPLACEMENTLIST короче, чем список поиска SEARCHLIST, то вместо недостающих символов в
списке замены используется последний символ этого списка. Если список замены пуст, то символы из списка поиска
SEARCHLIST преобразуются сами в себя, что удобно использовать для подсчета числа символов в некотором
классе.
- s - все последовательности символов, которые были преобразованы в один и тот же символ, заменяются
одним экземпляром этого символа.
Примеры.
$str =~ tr/A-Z/a-z/; # преобразование прописных букв в строчные
$count=$str=~tr/\000//c; # подсчет числа символов в строке $str
$str =~ tr/\200-\377/ /cs; # любая последовательность символов с ASCII-кодами
# от 128 до 255 преобразуется в единственный пробел
Следующий скрипт преобразует русский текст в DOS-кодировке 866, содержащийся в файле "866.txt",
в русский текст в Windows-кодировке 1251, и записывает преобразованный текст в файл "1251.txt".
#! perl -w
open(IN866,"866.txt");
open(OUT1251,">1251.txt");
while ($line=<IN866>)
{
$line=~tr/\200-\257\340-\361/\300-\377\250\270/;
print OUT1251 $line;
}
close(IN866);
close(OUT1251);
Текст этого примера вместе с файлом можно взять
здесь.
На следующем шаге мы рассмотрим операцию заключения в кавычки.
Предыдущий шаг
Содержание
Следующий шаг