Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > изменение регистра русских букв


Автор: Гость_Alex 28.1.2004, 10:23
наконец-то нашел хороший форум по cgi и решил запостить свой первый вопрос smile.gif
изучать перл начал только недавно, так что вопросов много.

соббсно вопрос:
в форме подписки человек вводит свое имя русскими буквами, подскажите плиз строчку, заменяющий все буквы на строчные, а начальную букву имени на заглавную.

заранее спасибо.

Автор: Secandr 28.1.2004, 10:34
Попробуй lc
Ещё может понадобиться указать локаль: use locale

Автор: <YURIC> 28.1.2004, 13:28
Код
#!/usr/bin/perl
use locale;
$str='ыпРР;
$new=lcfirst($str);
print $new;


Результат:

Код
Ыпрр


Автор: korob2001 29.1.2004, 14:29
Можно так же воспользоваться эскейп последовательностями.
Например:
Код

#!/usr/bin/perl -w
use strict; # не обязательно, но желательно
use locale;
my $name = 'дЕнИс';
print "\u\L$name\n";


\L - переводит все последующие символы в нижний регистр
\u - переводит следующий один сивол в верхний регистр

Здесь у вас может возникнуть резонный и вполне логичный вопрос:
Что нужно сделать, чтобы ограничить последовательность \L в определённом месте строки, то есть чтобы она не распространялась на всю строку/список?

Например есть две переменные $name и $pass как показано ниже:
Код

#!/usr/bin/perl -w
use strict; # не обязательно, но желательно
use locale;
my $name = 'дЕнИс';
my $pass  = 'izo2TeR1';
print "\u\L$name $pass\n";  #Что-то не так...

Что же произошло?

В приведённом выше коде последовательности \u и \L сделали своё дело. Сначала последовательность \L перевела все символы в нижний регистр вместе с переменной $pass, затем подключилась последовательность \u и мы получили следующую строку: Денис izo2ter1

Угу, но ведь пароль должен оставаться паролем.
Тут приходит на помощь ещё одна управляющая последовательность \E.

Приведу пример не верного кода, указанного выше с устранённой проблемой:
Код

#!/usr/bin/perl -w
use strict; # не обязательно, но желательно
use locale;
my $name = 'дЕнИс';
my $pass  = 'izo2TeR1';
print "\u\L$name\E $pass\n";

\E - служит ограничителем для таких последовательностей как \L, \U, \Q

И так, что мы имеем?
Последовательности \u\L как и в примере выше делают своё дело, но так как последовательность \L распространяется на все последующие за ней символы, нам нужно её остановить там, где нужно (в нашем случае, сразу после переменной $name). \L начинает переводить символы один за другим в нижний регистр, сремительно продвигаясь к концу строки ;), но, когда она встречает \E, нашей проказнице \L ничего не остаётся, кроме как обломаться, что она и делает. Все остальные символы строки остаются в том регистре, в каком были раньше.

Внимание!!!
Если управляющие последовательности расположены друг за другом, в нашем случае это \u\L, то сначала включается последняя, то есть \L, а только потом включается \u. И так далее.
Гы-гы, во я выдал! ;)

Автор: Гость_ALex 2.2.2004, 11:23
даа, целый трактат ! smile.gif

спасибо всем за быстрые ответы.
сейчас буду экспериментировать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)