ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
1.12. Переформатирование абзацевПроблемаДлина текста не позволяет разместить его в одной строке. Требуется разделить его на несколько строк без переноса слов. Например, сценарий проверки стиля читает текстовый файл по одному абзацу и заменяет неудачные обороты хорошими. Замена оборота "применяет функциональные возможности" словом "использует" приводит к изменению количества символов, поэтому перед выводом абзаца его придется переформатировать.РешениеВоспользуйтесь стандартным модулем Text::Wrap для расстановки разрывов строк в нужных местах:use Text::Wrap;
КомментарийВ модуле Text::Wrap присутствует 4)ункция wrap (см. пример 1.3), которая получает список строк и переформатирует их в абзац с длиной строки не более $Text: :Wrap: : columns символов. Мы присваиваем переменной $columns значение 20; это гарантирует, что ни одна строка не будет длиннее 20 символов. Перед списком строк функции wrap передаются два аргумента: один определяет отступ первой строки абзаца, а второй - отступы всех последующих строк.Пример 1.3. wrapdemo #!/usr/bin/perl -w
undef $/;
use Text::Wrap qw(&wrap $columns);
1.13. Служебные преобразования символовПроблемаНекоторые символы выводимой строки (апострофы, запятые и т. д.) требуется преобразовать к специальному виду. Предположим, вы конструируете форматную строку для sprintf и хотите преобразовать символы % в %%.РешениеВоспользуйтесь подстановкой, которая снабжает префиксом \ или удваивает каждый преобразуемый символ: # Обратная косая черта$var =~ s/([CHARLIST])/\\$1/g; # Удвоение $var =~ s/([CHARLIST])/$1$1/g; КомментарийВ приведенных выше решениях $var - модифицируемая переменная, a CHARLIST - список преобразуемых символов, который может включать служебные комбинации типа \t или \п. Если преобразуется всего один символ, можно обойтись без скобок:$string =~ s/%/%%/g; Преобразования, выполняемые в следующем примере, позволяют подготовить строку для передачи командному интерпретатору. На практике преобразование символов ' и " еще не сделает произвольную строку полностью безопасной для командного интерпретатора. Правильно собрать весь список символов так сложно, а риск так велик, что для запуска программ лучше воспользоваться списковыми формами system и ехес (см. рецепт 16.11) - в этом случае вы вообще избегаете взаимодействия с интерпретатором. $string = q(Mom said, "Don't do that."); $string =~ s/(['"])/\\$1/g; Две обратные косые черты в секции заменителя были использованы потому, что эта секция интерпретируется по правилам для строк в кавычках. Следовательно, чтобы получить одну обратную косую черту, приходится писать две. Приведем аналогичный пример для VMS DCL, где дублируются все апострофы и кавычки: $string = q(Mom said, "Don't do that."); $string =-- s/(['"])/$1$1/g; С командными интерпретаторами Microsoft дело обстоит еще сложнее. В DOS и Windows COMMAND. СОМ работает с кавычками, но не с апострофами; не имеет представления о том, как поступать с обратными апострофами, а для превращения кавычек в литерал используется обратная косая черта. Почти все бесплатные или коммерческие Unix-подобные интерпретаторы для Windows пытаются исправить эту удручающую ситуацию. Кроме того, можно определить интервал с помощью символа -, а затем инвертировать его с помощью символа ". Следующая команда преобразует все символы, не входящие в интервал от А до Z: $string =~ s/(["A-Z])/\\$1/g; Для преобразования всех неалфавитных символов следует воспользоваться метасимволами \0 и \Е или функцией quotemeta. Например, следующие команды эквивалентны: $string = "this \Qis a test!\E"; $string = "this is\\ a\\ test!"; $string = "this " . quotemeta("is a test!"); > Смотри также ------------------------------- Описание оператора s/// в perlre(1) \\perlop(1) описание функции quotemeta рассматривается в perlfunc{\). В рецепте 19.1 рассматривается преобразование служебных символов в HTML, а в рецепте 19.6 - о том, как обойтись без передачи интерпретатору строк со служебными символами. 1.14. Удаление пропусков в обоих концах строкиПроблемаВ полученную строку могут входить начальные или конечные пропуски. Требуется удалить их.РешениеВоспользуйтесь парой подстановок:$string =~ s/"\s+//;
КомментарийУ этой проблемы имеются различные решения, однако в большинстве случаев приведенный вариант является наиболее э4)фективным. Для удаления последнего символа из строки воспользуйтесь функцией chop. В версии 5 была добавлена функция chomp, которая удаляет последний символ в том и только в том случае, если он содержится в переменной $/ (по умолчанию - "\n"). Чаще всего она применяется для удаления завершающего символа перевода строки из введенного текста: " Вывести полученный текст заключенным в >while( chomp; print ">$_<\n"; } > Смотри также -------------------------------- Описание оператора s/// Qperlre(1) реrlор(1) описание функций chop и chomp Bperlfunc(1). Начальные пропуски удаляются в функции getnum из рецепта 2.1 и при разделении элементов списка в рецепте 4.1.
|