Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

comprimer les lignes

1 réponse
Avatar
fred
J'essaye d'adapter ce petit script afin qu'il consid=E8re la ligne vide
comme la fin du premier bloc.

Je vous prie de m'aider.

use strict;
use warnings;
my @ar =3D [];
my $i =3D 0;
while (<DATA>) {
chomp; next if !length();
if (/^\s*&\s*$/) {
$i =3D 0; next;
}
push @{$ar[$i]}, @{$ar[$i++]} ? '&'.$_ : $_;
}
for my $ar (@ar) {
print @{$ar},"\n";

input
nom1
&
pr=E9nom1
&
adresse1

nom2
&
pr=E9nom2
&
adresse2

output
nom1&pr=E9nom2&adresse1
nom2&pr=E9nom3&adresse4

1 réponse

Avatar
Paul Gaborit
À (at) Fri, 11 Sep 2009 14:22:48 -0700 (PDT),
fred écrivait (wrote):
J'essaye d'adapter ce petit script afin qu'il considère la ligne vide
comme la fin du premier bloc.

Je vous prie de m'aider.

use strict;
use warnings;
my @ar = [];
my $i = 0;
while (<DATA>) {
chomp; next if !length();
if (/^s*&s*$/) {
$i = 0; next;
}
push @{$ar[$i]}, @{$ar[$i++]} ? '&'.$_ : $_;
}
for my $ar (@ar) {
print @{$ar},"n";

input
nom1
&
prénom1
&
adresse1

nom2
&
prénom2
&
adresse2

output
nom1&prénom2&adresse1
nom2&prénom3&adresse4



La logiqe de votre script est bien compliquée pour un résultat qui ne
marche pas complètement. Essayez de ne faire qu'une seule chose à la
fois :

use strict;
use warnings;
my @ar;
my @lignes;
while (<DATA>) {
chomp;
# suppression des espaces autour d'un &
s/^s*&s*$/&/;
if ($_ eq "") {
# une ligne vide déclenche le stockage
# des lignes accumulées dans @ar
push @ar, [@lignes];
@lignes = ();
} else {
# une ligne non vide est accumulée dans
# le tableau des lignes
push @lignes, $_;
}
}
# on stocke les lignes accumulées dans @ar
# si le fichier d'entrée ne se termine pas
# par une ligne vide
push(@ar, [@lignes]) if @lignes;

# on affiche le tableau de tableaux de lignes
for my $li (@ar) {
print @$li, "n";
}


--
Paul Gaborit - <http://perso.mines-albi.fr/~gaborit/>
Perl en français - <http://perl.mines-albi.fr/>