#perl
#perl
Вопрос:
Я использую функции Perl format
и write
для вывода некоторого текста.
Требования приведены ниже:
- Распечатайте статью (длина неизвестна) с использованием Perl
format
. - Максимум 80 символов в строке.
- Последнее слово следует перенести в следующую строку, если там недостаточно места.
- Необходимо сохранить пустые строки между абзацами.
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что любые пустые строки между абзацами не могут быть отображены. Я проверил, и, похоже, это вызвано использованием « ~~
«.
Формат определяется следующим образом.
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.
Комментарии:
1. Привет, daxim, спасибо за вашу помощь. Результат — это именно то, что я ожидаю. Однако, поскольку это задание, и я должен использовать формат Perl для выполнения вывода, и никакие другие модули не могут быть использованы. Есть еще предложения? Спасибо.