Parser un fichier organisé en Section Element avec des regex
Bonjour
Je travail sur un script perl qui analyse un fichier texte avec un format spécifique :
Section1
Item1
Item2
Item3
Item4
Section2
Item1
Item2
Item3
Item4
En sachant que j'ai déjà une petite idée du nom des sections.
Mon programme est déjà assez bien avancé, bien compliqué, très orienté regexp, alors je vais exposer un exemple simple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
#!/usr/bin/perl -w
use strict;
use warnings;
my $text = <<END;
Hommes
Pierre
Paul
Jacques
Jean
Femmes
Marie
Julie
END
my %items = (
hommes => [$text =~ /^Hommes\n/gim and $text =~ /\G(*.)\n/gim],
femmes => [$text =~ /^Femmes\n/gim and $text =~ /\G(.*)\n/gim],
);
print "$_\n" foreach (@{$items{femmes}});
print "$_\n" foreach (@{$items{hommes}}); |
$text : mon fichier (enfin, du texte quoi!)
%items : hash contenant la liste des items pour chacune des sections
hommes => [$text =~ /^Hommes\n/gim and $text =~ /\G(.*)\n/gim],
Ajoute au hash une liste identifié par la clé "hommes".
$text =~ /^Hommes\n/gim
Recherche le motif correspondant à la section homme avec un retour de ligne à la fin du motif
(non sensible à la casse, recherche multiligne pour que ^ corresponde à un début de ligne n'importe où dans la variable $text)
==> LOCALISE LA SECTION
$text =~ /\G(.*)\n/gim
Recherche chaque motif correspondant à une section et l'ajoute au tableau à revoyer.
\G permet de reprendre la recherche juste derrière le nom de la section
\n à la fin permet à \G de reprendre à chaque début de nouvelle ligne
(recherche multiple, multiligne, non sensible à la casse)
==> ENREGISTRE CHAQUE ITEM DE LA SECTION
Le problème est que si $text =~ /\G(.*)\n/gim rencontre le motif (.*)\n\n il est sensé arrêter la recherche alors qu'il continue.
Le résultat des print est :
Marie
Julie
Pierre
Paul
Jacques
Jean
Femmes
Marie
Julie
print "$_\n" foreach (@{$items{hommes}}) ne s'arrête pas à Jean comme il le devrait.
Voilà en espérant avoir été clair.
Merci d'avance :D