Поскольку файл читается построчно, искомая фраза, которая занимает несколько строк, никогда не может совпадать.
Один из основных подходов к решению этой проблемы - наличие флагов для областей вопросов и ответов.Так как у вас есть очень четкие маркеры для входа и выхода из этих регионов, код действительно прост
use warnings;
use strict;
use feature 'say';
my ($question, $answer);
my ($in_Q, $in_A);
while (my $line = <>) {
next if $line =~ /^\s*$/;
if ($line =~ /^\s*questionstart/) { $in_Q = 1; next }
elsif ($line =~ /^\s*questionend/) { $in_Q = 0; next }
elsif ($line =~ /^\s*answerstart/) { $in_A = 1; next }
elsif ($line =~ /^\s*answerend/) { $in_A = 0; next }
if ($in_Q) { $question .= $line }
elsif ($in_A) { $answer .= $line }
}
say "Question: $question";
say "Answer: $answer";
(я сократил if-elsif
утверждения только для краткости и акцента здесь)
Этот код делает некоторыеРазумные предположения о входном файле.Я требую, чтобы маркеры начинали строку (с возможными пробелами), но учитывали больше текста после них.Если вы хотите убедиться, что они единственные в строке, добавьте якорь $
в конце регулярного выражения (снова с \s*
).
Указано, что вход имеет один Q / A,Если он когда-нибудь изменится на несколько, переместите отпечатки в цикле, как только в конце ответа появится значение elsif (/^\s*answerend/) { .. }
Печать в вопросе подойдет, поэтому я не буду повторять это здесь.Если есть возможность напечатать формат, отличный от HTML, очистите результирующие строки от начальных и конечных пробелов, нескольких пробелов и строк новой строки.
Повторные проверки для одной и той же переменной могут привести к одномудля поиска конструкции типа case, что в Perl будет switch .Однако это все еще экспериментальная функция, которая работает так, что
трудно точно описать
(документация!).Кроме того, он также может включать в себя интеллектуальное сопоставление , которое довольно сложно описать, широко понимаемое как сломанное в его нынешней форме и определенно подлежащее изменению.Поэтому я рекомендую придерживаться каскадных операторов if-elsif (в этом подходе).