2010-11-15 5 views
0

Il y a quelques blocs dans mon fichier texte. J'ai supposé structurer mon texte par le bloc ci-dessous
Comment puis-je lire le bloc par les mots-clés. (Mot-clé1, mot-clé2, mot-clé3, mot-clé4).

J'ai deux questions.
1. Existe-t-il une méthode pour sortir efficacement la ligne suivante de chaque mot clé?
2. Je ne sais pas comment sauter la ligne vide interne entre keyword3 et keyword4. Le point clé est la fin définie par le bloc avec un blanc.Comment lire un bloc avec/sans ligne vide lorsque le bloc se termine par une ligne vide?

**block start** 

    Keyword1 
    Single Line # I need work on the line 
    Keyword2 
    Single or Multiple lines # I need work on the lines 
    Keyword3 
    (May be there is single or multiple Blank lines) 
    Single or Multiple lines # I need work on the lines 
    (May be there is single or multiple Blank lines) 
    Keyword4 
    Single or Multiple lines # I need work on the lines 
    Single or multiple Blank line 

**block end** 

Répondre

1

Si je comprends bien vos données, les lignes vides ne sont pas un indicateur fiable, car elles peuvent apparaître avant que le texte d'un mot-clé ne commence, après le texte ou pas du tout. Si c'est le cas, je ne pense pas qu'il sera utile de lire le texte en "mode paragraphe" (en réglant $/ sur une chaîne vide). De même, les lignes vides ne permettent pas, du moins de manière simple, d'identifier le début et la fin des sections de mots-clés ou des "blocs".

Vous allez devoir analyser le texte de manière plus fine, mais vous ne nous avez pas donné suffisamment d'informations pour fournir une réponse détaillée. Voici un exemple qui stocke simplement les lignes non-vides par mot-clé:

use strict; 
use warnings; 

my (%data, $keyword); 

while (my $line = <DATA>){ 
    next unless $line =~ /\S/; 
    chomp $line; 
    if ($line =~ /^Keyword/){ 
     $keyword = $line; 
    } 
    else { 
     push @{$data{$keyword}}, $line; 
    } 
} 

__DATA__ 
Keyword1 
data1 a 
Keyword2 
data2 a 
data2 b 
data2 c 
Keyword3 


data3 a 
data3 b 


Keyword4 
data4 a 
data4 b 
+0

Merci pour votre entrée de détails. M'a vraiment beaucoup aidé. –

1

Savez-vous sur la configuration $/ à la chaîne vide pour « mode paragraphes »?

Chaque appel à <> ou readline renvoie maintenant un enregistrement multiligne jusqu'à une ou plusieurs lignes vides, et chomp les supprime tous à la fin.

+0

Je ne connais pas '$ /'. Mais j'ai utilisé '<>' et 'chomp' il y a des mois. Je vous remercie. –

1

Ne peut pas vous faire juste un match multiligne et utiliser les mots-clés comme points d'ancrage comme ceci:

$data =~ /(Keyword1.*?Keyword2.*?Keyword3.*?Keyword4.*?)\n$/sm; 
my $block = $1; 

En fait, vous pourriez faire aussi bien et d'obtenir les données de chaque bloc:

my @keys = $data =~ /Keyword1(.*?)Keyword2(.*?)Keyword3(.*?)Keyword4(.*?)\n$/sm; 

et alors vous pouvez extraient des lignes vides dans chaque groupe.

Questions connexes