Разбить строку, содержащую непрерывный абзац, в выровненный по левому краю столбец строк - PullRequest
3 голосов
/ 14 августа 2010

В Perl, работая с абзацем текста в одной большой длинной строке без разрывов строк, как я могу использовать разбиение и RegEx (или что-то еще), чтобы разбить абзац на куски примерно одинакового размера на границе слова, для отображения моноширинным шрифтом?

Например, как мне изменить это:

"When you have decided which answer is the most helpful to you, mark it as the accepted answer by clicking on the check box outline to the left of the answer. This lets other people know that you have received a good answer to your question. Doing this is helpful because it shows other people that you're getting value from the community."

на это:

"When you have decided which answer is the most \n"
"helpful to you, mark it as the accepted answer \n"
"by clicking on the check box outline to the \n"
"left of the answer. This lets other people \n"
"know that you have received a good answer to \n"
"your question. Doing this is helpful because \n"
"it shows other people that you're getting \n"
"value from the community.\n"

Спасибо, Бен

Ответы [ 3 ]

4 голосов
/ 14 августа 2010

Конечно, используйте Text :: Wrap .Но вот иллюстрация только для этого:

#!/usr/bin/perl

use strict; use warnings;

use constant RIGHT_MARGIN => 52;

my $para = "When you have decided which answer is the most helpful to you, mark it as the accepted answer by clicking on the check box outline to the left of the answer. This lets other people know that you have received a good answer to your question. Doing this is helpful because it shows other people that you're getting value from the community.";

my ($wrapped, $line) = (q{}) x 2;

while ( $para =~ /(\S+)/g ) {
    my ($chunk) = $1;
    if ( ( length($line) + length($chunk) ) >= RIGHT_MARGIN ) {
        $wrapped .= $line . "\n";
        $line = $chunk . ' ';
        next;
    }
    $line .= $chunk . ' ';
}

$wrapped .= $line . "\n";

print $wrapped;
4 голосов
/ 14 августа 2010

Оформить Текст :: Wrap .

3 голосов
/ 14 августа 2010

Так как его здесь нет, с помощью регулярных выражений это не так уж сложно:

$str =~ s/( .{0,46} (?: \s | $ ) )/$1\n/gx;

Подстановка вставляет новую строку после 46 символов (соответствует примеру OP), за которыми следует пробел или конец строки. Модификатор g повторяет операцию для всей строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...