Преобразование регистра

Проблема

Строку с символами верхнего регистра необходимо преобразовать в нижний регистр, или наоборот.

Решение

Воспользуйтесь функциями и со служебными командами \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



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: