Perl foreach mais pas le dernier ;)

Résolu
sbouli Messages postés 208 Statut Membre -  
lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   -
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

  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
  2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    à 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
  3. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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
    1. sbouli Messages postés 208 Statut Membre 2
       
      ok ... aucune solutions ne fonctionnent ... je dois rater un truc là ...

      Stéphane
      0
  4. sbouli Messages postés 208 Statut Membre 2
     
    [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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    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