Преобразование регистра
Проблема
Строку с символами верхнего регистра необходимо преобразовать в нижний регистр, или наоборот.
Решение
Воспользуйтесь функциями
lс и
uс со служебными командами \L и \U:
use locale; # Необходимо в 5.004 и выше
$big = uc($little); # "bo peep" -> "BO PEEP"
$little = lc($big); # "JOHN" -> "John"
$big = "\U$little" # "bo peep" -> "BO PEEP"
$little ="\L$big" # "JOHN" -> "John"
Для замены отдельного символа используйте функции
lcfirst и
ucfirst со служебными командами \l и \u:
$big = "\u$little"; # "bo" -> "Во"
$little = "\l$big"; # "ВоРеер" -> "boPeep"
Комментарий
Функции и служебные команды выглядят по-разному, но делают одно и то же. Допускается указание
регистра как первого символа, так и целой строки. Вы даже можете форсировать применение верхнего
регистра для первого символа и нижнего — для всех остальных.
Встречая директиву use locale, функции преобразования регистра Perl и механизм поиска по шаблону начинают
«уважать» правила вашего национального языка. Благодаря ей становится возможным поиск символов с
диакритическими элементами и т. д. Одна из распространенных ошибок — преобразование регистра с помощью
tr///.
Такое решение работает не
всегда, поскольку из него выпадают все символы с умляутами, седилями и прочими диакритическими элементами,
встречающимися во многих языках. Команды преобразования регистра uс и \U понимают эти символы и обеспечивают
их правильное преобразование (по крайней мере, если в программе присутствует директива use locale). Исключение
составляет немецкий язык; символ Я в верхнем регистре выглядит как SS, но в Perl такое преобразование не поддерживается.
use locale;
$beast = "dromedary";
# Изменить регистр разных символов $beast
$capit = ucfirst($beast); # Dromedary
$capit = "\u\L$beast"; # (то же)
$capall = uc($beast); # DROMEDARY
$capall = "\U$beast"; # (то же)
$caprest = lcfrst(uc($beast)); # dROMEDARY
$caprest = "\l\U$beast"; # (то же)
Как правило, служебные команды обеспечивают согласованное применение регистра в строке:
# Преобразовать первый символ каждого слова в верхний регистр,
# а остальные символы - в нижний
$text = "tHIS is a loNG liNE";
$text =~ s/(w+)/\u\L$1/g;
print Stext;
This Is A Long Line
Ими также можно пользоваться для выполнения сравнений без учета регистра:
if (uc($a) eq uc($b)) {
print "a and b are the same\n";
}
Следующий фрагмент изменяет регистр примерно у 50 процентов символов.
sub randcase {
my $a = "";
my $r;
while ($_[0] =~ /(.)/g) {
$r = rand(100);
$s = ($r < 50) ? ("\040" ^ $1) : $1;
$a .= $s;
}
return $a;
}
См. такжеОписание функций
uc,
lc,
ucfirst и
lcfirst
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|