PERL: БИБЛИОТЕКА ПРОГРАММИСТА


PERL: БИБЛИОТЕКА ПРОГРАММИСТА - стр. 60


1.12. Переформатирование абзацев

Проблема

Длина текста не позволяет разместить его в одной строке. Требуется разделить его на несколько строк без переноса слов. Например, сценарий проверки стиля читает текстовый файл по одному абзацу и заменяет неудачные обороты хоро­шими. Замена оборота «применяет функциональные возможности» словом «ис­пользует» приводит к изменению количества символов, поэтому перед выводом абзаца его придется переформатировать.

Решение

Воспользуйтесь стандартным модулем Text::Wrap для расстановки разрывов строк в нужных местах:

use Text:.Wrap;

©OUTPUT = wrap($LEADTAB, $NEXTTAB, @PARA);

Комментарий

В модуле Text::Wrap присутствует функция wrap (см. пример 1.3), которая полу­чает список строк и переформатирует их в абзац с длиной строки не более $Text. :Wrap: : columns символов. Мы присваиваем переменной $columns значе­ние 20; это гарантирует, что ни одна строка не будет длиннее 20 символов. Перед


52    Глава 1 • Строки

списком строк функции wrap передаются два аргумента: один определяет отступ первой строки абзаца, а второй — отступы всех последующих строк

Пример 1.3. wrapdemo

#'/usr/bin/perl -w

# wrapdemo - демонстрация работы Text Wrap

@input = ( Folding and splicing is the work of an editor , not a mere collection of silicon , and , mobile electrons1 )

use Text Wrap qw($columns Swrap),

$columns = 20,

print 0123456789 x 2  \n ,

print wrap(    ,    , @input)  \n ,

Результат выглядит так:

01234567890123456789

Folding  and splicing   is  the work of an editor,   not a mere  collection of silicon  and mobile   electrons'

В результате мы получаем один абзац, в которой каждая строка, кроме послед­ней, завершается символом перевода строки:

й Объединение нескольких строк с переносом текста

use Text   Wrap,

undef $/,

print wrap(           ,   split(/\s*\n\s*/,   <>),

Если на вашем компьютере установлен модуль Term::ReadKey с CPAN, вы може­те воспользоваться им для определения размеров окна, чтобы длина строк соответ­ствовала текущему размеру экрана. Если этого модуля нет, размер экрана иногда можно взять из $ENV{COLUMNS} или определить по выходным данным команды stty.




Начало  Назад  Вперед



Книжный магазин