Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl изменить регистр букв, регулярные выражения регистр 
:(
    Опции темы
burakov
Дата 20.2.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Всем, спасибо.
конструкция в которой используется подпрограмма, пока меня вполне устраивает
ибо работать я буду пока только в cp1251., а 

ёЁ
я заменил принудительно отдельным 
$name =~ tr/ё/e/;
$name =~ tr/Ё/e/;

вроде бы сработало (буква "ё" вообще не нужна заменил ее на "е" да и все)





--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
amg
Дата 20.2.2007, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



Цитата(burakov @  20.2.2007,  14:37 Найти цитируемый пост)
$name =~ tr/ё/e/;
$name =~ tr/Ё/e/;

Можно одним выражением:
$name =~ tr/ёЁ/eе/;
либо
$name =~ s/[ёЁ]/е/g;
или даже без него
$name =~ tr/А-ЯA-ZёЁ/а-яa-zeе/;

Это сообщение отредактировал(а) amg - 20.2.2007, 15:02
PM MAIL   Вверх
burakov
Дата 20.2.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 554
Регистрация: 28.7.2006

Репутация: нет
Всего: нет




оставвил  $name =~ tr/А-ЯA-ZёЁ/а-яa-zeе/;
действительно работает. спасибо

еще как то коряво реализован у меня поиск первого символа слова
через split массив и т.д.

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



--------------------
Нотный архив http://libnote.ru скачать ноты бесплатно
PM MAIL   Вверх
amg
Дата 20.2.2007, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



Цитата(burakov @  20.2.2007,  15:21 Найти цитируемый пост)
еще как то коряво реализован у меня поиск первого символа слова
Что-то не приходит в голову элегантное решение. Варианты:
Код

$name = ucfirst lc $name;
$name =~ tr/А-ЯёЁ/а-яeе/;
$name =~ s/^([а-я])/chr(ord($1+32))/e;

Код

$name =~ tr/А-ЯA-ZёЁ/а-яa-zeе/;
$name =~ s/^(.)/$_=$1;tr{а-яa-z}{А-ЯA-Z};$_/e;

PM MAIL   Вверх
Shaggie
Дата 20.2.2007, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 1
Всего: 72



amg, элегантность во вред скорости?

По хорошему надо бы локаль настроить, но она мне так и не поддалась smile 


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
amg
Дата 20.2.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 1
Всего: 50



Цитата(Shaggie @ 20.2.2007,  16:00)
amg, элегантность во вред скорости?

По хорошему надо бы локаль настроить, но она мне так и не поддалась smile

Ну, часто элегантное решение бывает и самым быстрым. А локаль конечно хорошо было бы настроить. Конечно, это самый элегантный (и быстрый) вариант.

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

sub Ucfirst {
  my $name = ucfirst lc $_[0];
  $name =~ tr/ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/ёйцукенгшщзхъфывапролджэячсмитьбю/;
  (my $first) = $name=~/^(.)/;
  $first =~ tr/ёйцукенгшщзхъфывапролджэячсмитьбю/ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ/;
  substr($name,0,1) = $first;
  return $name;
}


PM MAIL   Вверх
Shaggie
Дата 6.3.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: 1
Всего: 72



Нашел интересный подход, спасибо Nitr!
В стандартную поставку Перл входит модуль Encode, позволяющий производить кодирование-декодирование информации.
Код

use Encode qw(encode decode);

# строка в кодировке cp1251
my $content='иВаН';

# декодируем в стандарт
$content=decode('cp1251', $content);

# производим необходимую конвертацию
$content=ucfirst lc $content;

# кодируем для вывода в виндовую консоль
# (иначе можно применить обратно cp1251 или еще что душе угодно)
$content=encode('cp866', $content);

print $content;

или если коротко:
Код

use Encode qw(encode decode);
my $content='иВаН';
print encode('cp866', ucfirst lc decode('cp1251', $content));

У меня работает, выводит "Иван".

Вполне изящное решение smile 


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
GoDleSS
Дата 27.3.2007, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: нет
Всего: 2



Как вариант.

Код

#!/usr/bin/perl

print "Content-type:text/plain;Charset:windows-1251;\n\n";

# С локалью
use locale;
my $name='аБрА';
$name=~s/(\w+)/\u\L$1/gs;
print $name, "\n";

# Без нее
$name='аБрА';
print Ucfirst($name);

sub Ucfirst {
    my $string=shift;
    $string=~s/(\w+)/\u\L$1/gs;
    $string=~s/^(.)//s;
    my $first=$1;
    $first=~tr/[а-я]/[А-Я]/;
    $string=~tr/[А-Я]/[а-я]/;
    $string=$first.$string;
    undef $first;
    return $string;
}


Это сообщение отредактировал(а) GoDleSS - 27.3.2007, 23:39
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
nitr
Дата 28.3.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 12
Всего: 84



GoDleSS, см. комментарии amg, он доходчиво написал, почему ты неправ smile (вариант без локали) 


--------------------
PM   Вверх
GoDleSS
Дата 28.3.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 105
Регистрация: 11.2.2007
Где: Пироговский

Репутация: нет
Всего: 2



nitr, не говорю, что это полностью грамотный вариант, просто он имеет право на существование.
ёЁ естественно стоит обработать отдельно, если есть необходимость и гораздо лучше будет вариант с транслитерацией не диапазоном, а прямы списком ("tr/ЁЙЦУКЕНГШ..."), - быстрее и точнее.
+ конечно это вариант только для win-1251, либо переделав для любой другой 1 кодировки.

В данном случае, имхо, лучшим решением будет не перевод текста  N-ую кодировку и т.д.(т.к. это лишняя библиотека, если код короткий, либо лишняя ручная обработка), а создание нескольких обработок в одной или нескольких же функциях, либо универсализированной функции.
Что именно я этим хочу сказать:
- пусть есть некая система, в которой используется 1 или неск. функций строкового приведения + может изменяться кодировка вывода.
- пусть кодировка настраивается в неких конфигах(таблица базы, как правило)

И того имеем решение проблемы:
Код

%Chars=SetCharMap($Config{'ENCODE'});

$String=Ucfirst($String, %Chars);

sub SetCharMap {
 my $encode=shift;
 my %Chars;
 if ($encode=~m/win[a-z]*\-1251/i) {
  $Chars{'UC'}='...';
  $Chars{'LC'}='...';
 } elsif ($encode=~m/koi8/i) {
  $Chars{'UC'}='...';
  $Chars{'LC'}='...';
 }
 ...
}

sub Ucfirst {    
    my $string=shift;
    my %Chars=shift;    
    ...
    $string=~tr/$Chars{'UC'}/$Chars{'LC'}/;
    ...    
    return $string;    
}

или подобное, за конкретную работоспособность не уверен, но логика, думаю, понятна.
--------------------
It's a nice day to die my friend!
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.