Приветствую! Небольшой лонгрид.
1) В перле юникодная строка может быть представлена двумя способами: * как последовательность символов с номерами в т.ч. больше 255 - собственно юникод * как последовательность байтов с номерами строго до 255, кодирующая юникодную строку - это utf8 encode_utf8 делает из символов (cyrillic_a и пр) байты (0x0-0xFF) decode_utf8 делает из байтов символы (и дохнет, если ей попался символ > 255) Те же символы вызывают warning "wide characters in print". Потому что они не предназначены для IO, IO умеетработать только с байтами (в шине 8 бит на байт и всё!). 2) Флаг is_utf8, к сожалению, обозначает нечто противоположное своему названию - то есть, предполагается, что is_utf8=1 это строка символов, а is_utf8=0 это бинарная строка, из которой эти символы можно собрать. См. негодование Леманна по этому поводу в perldoc JSON::XS 3) use utf8; означает, что все бинарные последовательности в самом скрипте надо приводить к юникоду. Это то, что вам нужно, потому что 4) вам нужно работать именно с символами, для вас [а-я] это маленькая русская буква, а не "половинка а, какой-то бинарный мусор, половинка я". В идеале везде внутри периметра должен быть только юникод, 2018 год на дворе, всё-таки! Конец лонгрида Соответственно, (1) проверить, что везде, где есть кириллические литералы, стоит use utf8; - иначе "Лена и Маша" - не два женских имени, а бинарный мусор. (2) смотреть, какой флаг is_utf8 у того, что возвращается из dom. Возможно, где-то в недрах модуля, разбирающего HTML, есть настройка "у нас везде юникод", тогда её надо включить. По-моему, так. 2018-01-11 0:24 GMT+02:00 Sergey Aleynikov via Moscow-pm <[email protected]>: > Добрый день, > > И регулярное выражение и строка для поиска должны быть в одинаковой > кодировке с одинаково выставленным флагом UTF8. В лучшем случае - в > utf-8 с выставленным флагом. Ищите, почему в вашем коде это не так. > > Best regards, > Sergey Aleynikov > > > 11 января 2018 г., 0:15 пользователь Alex Povolotsky via Moscow-pm > <[email protected]> написал: > > Добрый вечер > > > > Вытаскиваю страницу с помощью Mojo::UserAgent, получаю $tx->res->dom, и > > пытаюсь сравнивать регекспом со строковыми литералами. > > > > $dom->at('h1.title')->text =~ /ой/ > > > > не работает > > > > что совсем непонятно > > > > encode('utf-8', $dom->at('h1.title')->text) =~ /ой/ > > > > в отладчике возвращает 1, в коде - не отрабатывает. > > > > Кто-нибудь это уже борол? > > > > Alex > > -- > > Moscow.pm mailing list > > [email protected] | http://moscow.pm.org > -- > Moscow.pm mailing list > [email protected] | http://moscow.pm.org > -- Konstantin S. Uvarin jabber: see <from> skype: kuvarin http://github.com/dallaylaen
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
