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


Автор: Гость_Сергей 20.7.2004, 11:54
Привет!

Почему из-за русской буквы, стоящей после .+? неправильно работает RE?
Дома в ActiveState Perl все работает правильно, а на американском сервере
неправильно.

Вот пример:
$_='Результат поиска: найдено сайтов';
if (m!^Результат поиска.+?сайтов!m) - не находит.
А замена с на \xF1 не помогает:
if (m!^Результат поиска.+?\xF1айтов!m) - не находит.
Если разделить пробелом, то уже находит:
if (m!^Результат поиска.+? сайтов!m)
Вот еще работающий вариант разделителя (прямо анекдот):
if (m!^Результат поиска.+?\s{0}сайтов[^<]+<b>(\d+)</b>!m)

Локаль выставляю так:

use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "ru_RU.cp1251");

И она работает (проверял в RE, uc и lc).
Почему 8-мибитный символ влияет на результат? В других местах RE русские буквы
не мешают работе даже без установки локали.

Успехов!
Сергей

Автор: korob2001 20.7.2004, 17:19
if (m!^Результат поиска.+?сайтов!m)
То, что отмеченно красным - удали. Должно получиться что-то типа этого:
if (m!Результат поиска.+?сайтов!m)

Вот рабочий пример:
Код

#!/usr/bin/perl -w
use strict;
use locale;
$_ = 'Результат поиска: найдено сайтов';
if ( /Результат поиска.+?сайтов/m ) {
    print "Нашёл: $_\n";
} else {
    print "Ничего не нашёл\n";
}

Удачи.

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