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 : Sélectionner tout - Visualiser dans une fenêtre à part
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