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


Автор: burakov 15.5.2007, 09:56
Добрый день!
Работаю под WIndows XP
Задача ...
найти в файле слово "припев" независимо от регистра букв. Т.е. Может быть и "ПРИПЕВ", и "пРИпЕв".
И затем сделать все буквы в этом слове заглавными.


пишу 
if ($str =~ /припев/i) {$str =~ tr/а-я/А-Я/; $str=~ tr/a-z/A-Z/;})

НЕ ИЩЕТ!!! Т.е. слово "припев" находит, а все остальное типа "пРИпЕв" - не находит.
Возможно ли под windows использовать ключ
"...      i    - не различать строчные и заглавные буквы...     "     


Автор: nitr 15.5.2007, 10:30
burakov, 
Код

use locale;
...


Добавлено через 1 минуту и 44 секунды
это как раз и включит
Цитата(burakov @  15.5.2007,  09:56 Найти цитируемый пост)
Возможно ли под windows использовать ключ"...      i    - не различать строчные и заглавные буквы...     "    


Добавлено через 4 минуты и 27 секунд
более подробно perldoc locale и др.

Автор: amg 15.5.2007, 10:35
use locale;
Если это заработает, то проблем не будет. И i будет правильно восприниматься, и не нужно будет никаких tr - просто $str = uc $str;

А если не заработает, то можно так:
Код

$str =~ tr/а-яё/А-ЯЁ/; # Только для Windows
$str=~ tr/a-z/A-Z/;
if ($str =~ /ПРИПЕВ/) { ... }


Добавлено
О! nitr меня опередил!

Автор: nitr 15.5.2007, 10:35
а так вот возможности форума smile
http://forum.vingrad.ru/forum/topic-151257/anchor-entry1133610/0.html#look

Добавлено через 1 минуту и 48 секунд
amg, да... но в Windows заработает smile я не видел где не заработает, а твой код к сожалению (второй пример) все буквы в словах переведёт в прописные smile (как тут их назвали заглавные smile) )

Автор: Shaggie 15.5.2007, 10:37
Я уже что-то похожее писал... надо декодировать строку во внутреннее её представление на перле, тогда всё будет работать:
Код

use Encode qw(encode decode);

$word = decode('cp1251', 'ПриВЕт');
$str = lc($str) if ($str =~ /$word/i);

Если выводишь на виндовую консоль, в конце надо добавить
Код

print encode('cp866', $str);



P.S. просто у меня отчаяно отказывается работать use locale;

Автор: nitr 15.5.2007, 10:38
[offtopic]
amg, хе хе ;)
[/offtopic]

Shaggie, я помню этот код (т.е. такой способ smile (молодец) ), человеку (задавшему) тогда надо почитать perldoc Encode , чтобы потом не путаться с кодировками

тогда так (если правильно понять вопрос ;) ):
Код

#!perl -w
use Encode qw(encode decode);

my $str = 'Привет ПриВет приВет ПРИВЕТ';
$str = decode('cp1251', $str);
my $word = decode('cp1251', 'привет');

if ($str =~ s/($word)/uc $1/gei) {
    print "OK\n";
}

print encode('cp866', $str);

подойдет оно, если конечно не сработает этот:
Код

#!perl -w
use locale;

my $str = 'Привет ПриВет приВет ПРИВЕТ';
if ($str =~ s/(привет)/uc $1/gei) {
    print "OK\n";
}

print $str;

Автор: burakov 15.5.2007, 11:05
Друзья - огромное спасибо.

Заработало 
use locale;

Добавлено через 2 минуты и 24 секунды
в принципе помечаю вопрос как "решенный".

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