J'ai creusé mon cerveau en essayant de trouver une solution, mais en vain. Toute orientation serait appréciée.Comment puis-je imprimer toutes les lignes entre les lignes vides précédente et suivante lorsqu'une correspondance est trouvée?
_data_
mascot
friend
ocean
\n
parsimon
**QUERY**
apple
\n
jujube
\n
apricot
maple
**QUERY**
rose
mahonia
\n
.... Étant donné le mot-clé de recherche est QUERY, il serait sortie:
parsimon
**QUERY**
apple
apricot
maple
**QUERY**
rose
mahonia
j'ai écrit un code qui ne fonctionne pas comme je le voudrais:
#!/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
}
}
J'ai également essayé quelque chose comme ça, mais il y avait une erreur syntaxique:
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]";
}
.....
Il semble que la seule bonne chose que j'ai jusqu'à présent réussi à atteindre est que je peux imprimer tout entre les lignes correspondantes et suivant les lignes vides en utilisant le code suivant:
for (0 .. $#file) {
if($file[$_+1] =~ /QUERY/) {
print $file[$_] until $file[$_++]=~/^$/;
Quelqu'un peut-il me diriger dans le droit direction? Merci!
Mike
Modifier
Je pense que la solution de brian d foy à mon problème est le meilleur. Au mieux, je veux dire le plus efficace. Mais la solution de Jeff est la plus utile et je profite beaucoup de ses explications détaillées ligne par ligne et quoi de mieux, en utilisant son code, avec seulement quelques réglages, je peux faire autre chose, par exemple, imprimer toutes les lignes entre les lignes commençant par un chiffre lorsqu'un motif est trouvé. Et le code de Kinopiko est le code que j'espérais pouvoir écrire.
Pourquoi? Votre sortie d'échantillon semble incompatible avec ce que vous cherchez réellement. –
Je suppose qu'il y avait un format. jujube ne sera pas imprimé car il y a une ligne vide au dessus et en dessous. – Mike
Désolé typo. Je veux dire qu'il y avait une erreur de format d'affichage. – Mike