начнем с задачи — имеется текст, полученный ocr-ом книги; текст в общем-то находится в utf8, однако 100% гарантии нет
поскольку ocr-софт делает типичные ошибки, исправлять их удобнее скриптами на perl; в данном случае perl используется как такой «улучшенный sed», и именно в таком ключе надо отвечать на мой вопрос — т.е. выбирать решения попроще, покороче, понадежнее, и без «Set your PERL_UNICODE envariable to AS» — все должно находится внутри скрипта, а не в переменных окружения!
с учетом прошлого вопроса regexp-ы в perl для работы с русскими буквами в юникоде — как? вырисовывается такая схема:
фаза 1: проверка файла на юникодность, исправление не-юникодности, и *возможно* исправление символов, которых в книге точно нет
исправление не-юникодности должно делаться регекспами, *специально* написанными руками под каждый (редкий) случай неюникодности, а не автоматическим-пропуском-неюникодного-символа скажем, поэтому код должен выполнять регекспы побайтово:
while(<>){
s/че-то-такое-не-представимое-в-утф8/исправленный вариант/;
s/че-то-другое-не-представимое-в-утф8/тоже исправленный вариант/;
...
s/£/f/; # <-- возможно это делать здесь, а возможно в фазе 2 ?
die("место где случилась неюникодность") if /$_-строка-не-юникод/;
print;
}
фаза 2: исправление ошибок ocr-а уже в точно юникодном тексте
while(<>){
s/: :/::/g;
s/c([а-я])/с$1/g; # первое "с" латинское, второе -- русское
# это лишь пример, на самом деле там все сложнее и по-другому
...
print;
}
теперь сам вопрос: предложите необходимые шебанги, опции, use-ы и прочее, чтобы эта фигня работала *надежно* (фаза 1 — побайтово, фаза 2 — в юникоде)
как сделать «if /$_-строка-не-юникод/»?
еще можно предложить вообще иные решения, если такие неудобны
p.s. это тема для медленного, неторопливого обсуждения, так что не ожидайте, что я на возникшие у вас вопросы отвечу сразу, как в прошлый раз