Perl foreach mais pas le dernier ;)

Résolu/Fermé
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 - 29 oct. 2008 à 09:47
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 29 oct. 2008 à 21:37
Bonjour,

Je voudrais écrire :

Champ1|Champ2|Champ3\r\n
et pas :
Champ1|Champ2|Champ3|\r\n

foreach (@$valeur) {
	print FICHIER "$_|";
}
print FICHIER "\r\n";


Comment éviter le | à la fin de la ligne après le dernier champ ....

Stéphane

5 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
29 oct. 2008 à 18:37
Salut,

Voici le résultat (maintenant c'est testé ;-)
J'ai corrigé les erreurs
lami20j@debian:~/trash$ cat ccm4.pl
#!/usr/bin/perl

while(my $e=<DATA>){
  my @tableau=split /\s/,$e;
  print map { "$_|" } @tableau[0..$#tableau-1];print "$tableau[-1]\r\n";
}
__END__
Champ1 Champ2 Champ3
lami20j@debian:~/trash$ perl ccm4.pl
Champ1|Champ2|Champ3
lami20j@debian:~/trash$
lami20j@debian:~/trash$
lami20j@debian:~/trash$ cat ccm5.pl
#!/usr/bin/perl

while(my $e=<DATA>){
  my @tableau=split /\s/,$e;
  print "$_|" foreach (@tableau[0..$#tableau-1]);print "$tableau[-1]\r\n";
}
__END__
Champ1 Champ2 Champ3
lami20j@debian:~/trash$ perl ccm5.pl
Champ1|Champ2|Champ3
lami20j@debian:~/trash$
lami20j@debian:~/trash$
lami20j@debian:~/trash$ cat ccm6.pl
#!/usr/bin/perl

while(my $e=<DATA>){
  my @tableau=split /\s/,$e;
  my $v=pop @tableau;print "$_|" foreach(@tableau);print "$v\r\n";push @tableau,$v;
}
__END__
Champ1 Champ2 Champ3
lami20j@debian:~/trash$ perl ccm6.pl
Champ1|Champ2|Champ3
lami20j@debian:~/trash$
lami20j@debian:~/trash$
lami20j@debian:~/trash$ cat ccm7.pl
#!/usr/bin/perl

while(my $e=<DATA>){
  my @tableau=split /\s/,$e;
  print join("|",@tableau[0..$#tableau-1],"$tableau[-1]");print "\r\n";
}
__END__
Champ1 Champ2 Champ3
lami20j@debian:~/trash$ perl ccm7.pl
Champ1|Champ2|Champ3
lami20j@debian:~/trash$




2
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
29 oct. 2008 à 10:46
à par un if, je ne voi pas.
foreach (@$valeur) {
	if($_!=$valeur[$#valeur]){print FICHIER "$_|";}
        else{print FICHIER "$_";}
}
print FICHIER "\r\n";


ou un truc dans le genre, mais je ne suis pas un expert en perl,
Une autre solution possible, serait d'utiliser backspace :
foreach (@$valeur) {
	print FICHIER "$_|";
}
print FICHIER "\b\r\n";


bonne chance
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
29 oct. 2008 à 12:54
Salut,

Voici 4 possibilités. Je n'ai pas testé ;-)
print map { "$_|" } @tableau[0..$#tableau-1] , "$tableau[-1]\r\n";
print "$_|"; foreach (@tableau[0..$#tableau]) and print "$tableau[-1]\r\n";
$v=pop @tableau;print "$_|" foreach(@tableau);print "$v\r\n";push @tableau,$v;
print join("|",@tableau[0..$#tableau-1],"$tableau[-1]");print "\r\n";



0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
29 oct. 2008 à 16:32
ok ... aucune solutions ne fonctionnent ... je dois rater un truc là ...

Stéphane
0
sbouli Messages postés 200 Date d'inscription jeudi 20 décembre 2007 Statut Membre Dernière intervention 14 août 2014 2
29 oct. 2008 à 16:52
[EDIT : le $#valeur renvoi -1 et pas la taille du tableau !!]


Au cas où ce serait lié, voici le code un peu plus complet ... :

open(FICHIER,">>$fichier_path") or die ("Erreur lors de l'ecriture de $fichier_path") ;
while(my ($clef, $valeur) = each %internautes) {
         foreach (@$valeur) {
	print FICHIER "$_|";
        }
        print FICHIER "\r\n";
}
close(FICHIER);


avec %internautes dont le value est remplis par le tableau temp_internaute :

@$temp_internaute=($addr,$raisons{$raison},1,&datetime, "$revMsgDateStr $msgHr:$msgMin:00", 'null');
$internautes{$clef}=$temp_internaute;

Stéphane
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
29 oct. 2008 à 21:37
Re,

Juste pour le fun ;-)
$ echo "Champ1 Champ2 Champ3" | perl -ne 's/ +/|/g;print'
Champ1|Champ2|Champ3
$ echo "Champ1 Champ2 Champ3" | perl -ne 's/\b +/|/g;print'
Champ1|Champ2|Champ3
$ echo "Champ1 Champ2 Champ3" | perl -ne 's/\s+(?!$)/|/g;print'
Champ1|Champ2|Champ3

0