je voulais proposer une seconde approche : en fait, ce que je comprends, c'est qu'il faut récupérer les chaines de caractères d'un fichier ; une chaine étant définie par un texte entre guillemets sur une ou plusieurs lignes, une ou plusieurs fois par ligne
en gros, cela revient à dire qu'on alterne des séquences d'affichage (après le premier guillemet) et de non affichage (après le suivant), etc.
du coup, je suis parti sur un programme qui va découper les données en entrées en fonctions des guillemets, et afficher un élément sur deux ensuite
un petit exemple vaut mieux qu'un long discours
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 27 28 29 30 31 32
|
use strict;
use warnings;
open my $fh, 'ex.txt';
# flag sert a alterner les chaines
my $flag=0;
# str est utilise pour construire la chaine de travail
my $str='';
# lecture du fichier en sautant les cas particuliers Left/Top...
while (<$fh>) {
next if (/^\s*(?:Left|Top|Width|Height):/);
# supression des sauts de lignes et des espaces multiples (pour faire joli uniquement)
chomp;
s/\s+/ /g;
# construction d'une chaine globale de toutes les lignes "intéressantes"
$str.=$_;
}
# fin d'utilisation du fichier
close $fh;
#découpage de la chaine par les caractères "
my @elts=split /"/, $str;
#boucle sur le tableau pour n'en garder qu'un sur deux
foreach (@elts) {
print "$_\n" if $flag;
#inversion du flag pour garder un élément sur deux
$flag=$flag?0:1;
} |
Résumé :
Le programme lit tout le fichier et saute les lignes qui posent problème.
Il concatène tout le fichier dans une seule chaine en virant les sauts de lignes et en simplifiant les espaces (ça, c'est juste pour faire plus joli)
Une fois le fichier lu, la chaine générée est découpée en fonction des guillemets et placées dans un tableau.
Il ne reste qu'à afficher un élément sur deux du tableau...
Si le fichier est correct (qu'il ne manque pas de guillemets), ça doit marcher (j'ai testé sur les exemples ici).
Partager