|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Vladimir Lomov 2:5020/400 14 Mar 2007 18:37:04 To : Artem Chuprina Subject : Re: Поиск и замена с русскими буквами -------------------------------------------------------------------------------- Artem Chuprina пишет: [skip... много] VL>> Взял с библиотеки Мошкова пару книг и теперь буду VL>> "объяснять" как положено оформлять, с особенности VL>> при помощи "современных средств, а именно VL>> текстовых редакторов" (в кавычках, т.е., имхо, VL>> полный бред, редактор должен редактировать, а не VL>> форматировать текст; фраза не моя). Затем покажу, VL>> как это можно сделать в LaTeX'е. Кому что удобнее, VL>> тем и будет пользоваться. AC> Латеху, кстати, пофиг лишние пробелы. Это вполне может быть AC> дополнительным аргументом... VL>> Пробелма возникла когда взял наобум хороший текст VL>> ("Сами боги", Айзек Азимов). Куча лищних пробелов VL>> и пр. "мелочи". Решил немного упростить задачу, да VL>> и perl подучить. Что получилось --- известно. AC> Hу да, в итоге зачем-то сильно ее усложнил. Согласен! Hерациональность мышления распространённое явление?! VL>> Да, вот ещё одна проблема. Все преобразования VL>> делаются в цикле: VL>> foreach(<IN_FH>) { VL>> s/(^\ {$paragraph_indent_num})/\n$1/go; VL>> VL>> s/([-\.,!\?'";:>]|\b)\s+([-\.,!\?'";:<]|\b|\n)/$1 VL>> $2/g; VL>> print OUT_FH $_; VL>> $line++; VL>> } VL>> Hа выходе файл в том формате, что нужно. Hо если VL>> использовать немного другой цикл VL>> foreach(<IN_FH>) { VL>> s/(^\ {$paragraph_indent_num}.*)\n/\n$1 /go; VL>> s/(^\w.*)\n/ $1 /; VL>> VL>> s/([-\.,!\?'";:>]|\b)\s+([-\.,!\?'";:<]|\b|\n)/$1 VL>> $2/g; VL>> print OUT_FH $_; VL>> $line++; VL>> } VL>> чтобы весь абзац располагался в одной строке (для VL>> openoffice'а), то не все лишние пробелы убираются VL>> и не всегда срабатывает второй s. Какие-нибудь VL>> идеи, предложения? AC> Второй s срабатывает всегда. Возможно, не всегда будет матчиться AC> написанный там регекс, ну так регекс, который матчится всегда - это AC> только .* :-) Ты чего имел в виду-то, когда его писал? Для первого варианта: чтобы перед абзацем пустая строка вставлялась. Затем убирались лишние пробелы. Для второго варианта: вставить пустую строку перед абзацем, убрать все символы новой строки для одного абзаца, чтобы поместить его в одну строку. AC> А лишние пробелы убираются. Hо ты их вторым s дополнительно вставляешь, AC> причем специально так, чтобы не дай бог не убрались. Хорошо, над этим я ещё подумаю. Често :-). С другой стороны, то что возникли вопросы означает, что сам метод действия неэффективен. Думаю остановиться на том, что убирать пробелы буду при помощи s/ +/ /g;, а абзацы помечать для дальнейшего разбора. Всем спасибо за полезную дисскусию. Отдельное спасибо Artem Chuprina и Eugene Grosbein за ценные замечания. - --- Best regards, Vladimir Lomov -- Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru --- ifmail v.2.15dev5.3 * Origin: Talk.ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/64883651d80f.html, оценка из 5, голосов 10
|