Проблема с Perl format () — Пустые строки между абзацами удаляются и не могут быть отображены

#perl

#perl

Вопрос:

Я использую функции Perl format и write для вывода некоторого текста.

Требования приведены ниже:

  1. Распечатайте статью (длина неизвестна) с использованием Perl format .
  2. Максимум 80 символов в строке.
  3. Последнее слово следует перенести в следующую строку, если там недостаточно места.
  4. Необходимо сохранить пустые строки между абзацами.

Проблема, с которой я сталкиваюсь сейчас, заключается в том, что любые пустые строки между абзацами не могут быть отображены. Я проверил, и, похоже, это вызвано использованием « ~~ «.

Формат определяется следующим образом.

 format FULL_TEXT =
Full Story:
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
$storyBody
.
  

Есть ли способ напечатать эту пустую строку между абзацами, сохраняя при этом другие требования?

Например, ниже то, что я ожидаю. Однако, как я уже говорил ранее, пустая строка между двумя абзацами удалена и не может быть отображена.

Прошлой ночью COLLINGWOOD развернула флаг премьер-лиги 2010 года на MCG и отметила это событие, как того требовал протокол, понизив цвета своего давнего соперника Carlton в конкурсе, который был эпичным по стилю, если не по последствиям.

Зрителей было 88 181, что является рекордом для домашних и выездных соревнований между этими клубами. В AFL шевелится старое чувство.

Ответ №1:

Хитрость заключается в том, чтобы разбить текст на абзацы и записывать каждый абзац за раз.

 use strict;
use warnings;
# slurp text
my $text = do { local $/; <> };
# split into paragraphs
my @paragraphs = split /n /, $text;
# define format, including newline at the end
format STDOUT =
  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$_
  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
$_

.
# write text to format
write for @paragraphs;
  

Назовите это следующим образом:

 perl /tmp/fmt.pl < /tmp/article.txt
  

Если вы хотите или должны экономить память из-за того, что ваши статьи такие большие, вы можете объединить первые два шага:

 use strict;
use warnings;
# slurp text into paragraphs
my @paragraphs = split /n /, do { local $/; <> };
# define format, including newline at the end
format STDOUT =
  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$_
  ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
$_

.
write for @paragraphs; # write text to format
  

Комментарии:

1. Привет, Майкл, спасибо за вашу помощь. Хотя я не могу напрямую использовать ваше решение, потому что я упростил определение формата и сложность текста в моем вопросе, ваша идея вывода абзацев один за другим действительно вдохновила меня. Как вы и предлагали, я разделил текст на абзацы и вывел их по отдельности. Теперь я могу вставить пустую строку между абзацами. Проблема решена. Большое вам спасибо!

Ответ №2:

 use 5;
use strictures;
use Perl6::Form;

my $storyBody = 'COLLINGWOOD unfurled its 2010 premiership flag at the MCG last night and marked the occasion as protocol demanded, by lowering the colours of its longeststanding rival, Carlton in a contest that was epic in style, if not consequence.

The crowd was 88,181, a record for home-and-away contests between these clubs. An old feeling stirring in the AFL.';

my $form = form
'Full Story:',
'{[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[}',
map {s/n/rr/; $_} $storyBody;

print $form;
  

Вывод:

 Full Story:
COLLINGWOOD unfurled its 2010 premiership flag at the MCG last night and marked
the occasion as protocol demanded, by lowering the colours of its longeststanding
rival, Carlton in a contest that was epic in style, if not consequence.

The crowd was 88,181, a record for home-and-away contests between these clubs. An
old feeling stirring in the AFL.
  

Семантика r в форме (?:at)?s

Комментарии:

1. Привет, daxim, спасибо за вашу помощь. Результат — это именно то, что я ожидаю. Однако, поскольку это задание, и я должен использовать формат Perl для выполнения вывода, и никакие другие модули не могут быть использованы. Есть еще предложения? Спасибо.