Perl foreach mais pas le dernier ;)

Résolu
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. Modérateur
    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
    1. Contributeur
      à 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
      1. Modérateur
        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. ok ... aucune solutions ne fonctionnent ... je dois rater un truc là ...

          Stéphane
          0
      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
        1. Modérateur
          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