Я ломал голову, пытаясь найти решение, но тщетно. Любое руководство будет оценено.
_data_
mascot
friend
ocean
\n
parsimon
**QUERY**
apple
\n
jujube
\n
apricot
maple
**QUERY**
rose
mahonia
\n
.... Учитывая, что ключевое слово для поиска QUERY , будет выведено:
parsimon
**QUERY**
apple
apricot
maple
**QUERY**
rose
mahonia
Я написал код, который не работает так, как мне хотелось бы:
#!/usr/bin/perl
use strict;
use warnings;
open my $fh, '<', 'FILE' or die "Cannot open: $!";
my @file = <$fh>;
close $fh;
for (0 .. $#file) { # read from the first line to the last
if($file[$_] =~ /QUERY/){ # if the contents of a particular line matches the query pattern
my $start = $_-- until $file[$_--] =~ /^$/; #check the previous line for an empty line. continue until success. store the index of the empty line to $start.
my $end = $_++ until $file[$_++] =~ /^$/; #check the next line for an empty line. continue until sucess. store the index of the empty line to $end.
print "\n @file[$start..$end]"; #print all lines between the stored indexes
}
}
Я тоже пробовал что-то подобное, но была синтаксическая ошибка:
if($file[$_] =~ /QUERY/){
my $start = $_-4 if $file[$_-4] =~ /^$/;
continue my $start = $_-3 if $file[$_-3]=~/^$/;
------
my $end = $_+4 until $file[$_+4] =~ /^$/;
.....
print "\n @file[$start..$end]";
}
.....
Кажется, что единственное хорошее, чего мне удалось достичь, это то, что я могу напечатать все между совпадающими строками и следующими пустыми строками, используя следующий код:
for (0 .. $#file) {
if($file[$_+1] =~ /QUERY/) {
print $file[$_] until $file[$_++]=~/^$/;
Может ли кто-нибудь указать мне правильное направление?
Спасибо!
Mike
Редактировать
Я думаю, что решение моей проблемы Брайана Д Фоя - лучшее. Под лучшим я подразумеваю самый эффективный. Но решение Джеффа является наиболее полезным, и я очень выигрываю, особенно от его подробных построчных объяснений, и, что еще лучше, используя его код, используя всего несколько настроек, я могу сделать что-то еще, например, напечатать все строки между строки, начинающиеся с цифры, когда образец найден. А код Кинопико - это тот самый код, который я надеялся написать.