Forum Programmation.perl empêcher le champ vide à la fin du tableau

Posté par . Licence CC by-sa
Tags : aucun
0
22
août
2015

j'ai une boucle for qui me produit un champ vide a la fin de mon tableau comment pourrai je empeche cela?

    for my $i(map {clean($_)} @$row) {
      #chomp $i;       
    my $d = "<tr><td>$i</td></tr>\n";
    print $per_line_fh $d if ($i); 
    }
    print $per_line_fh "</table>\n</body>\n</html>";
    close $per_line_fh;
}

sub clean {   
    my $string = shift;
    $string =~ /\s*,\s*/;
    $string =~ /\s*,\s*/;
    return $string;

sortie on remarque qu'il ya le dernier champ est vide a la fin en principe il ne devrait pas existe comment empeche mon code de me le renvoyer. merci bien de votre aide.

   <tr><td> 0</td></tr>
   <tr><td> 50</td></tr>
   <tr><td> 1</td></tr>
   <tr><td> </td></tr>
   </table>
  </body>
  • # Au choix

    Posté par . Évalué à 2.

    Tester si $i est vide dans ton if conditionnant le print
    ou mieux
    Modifier ta fonction clean en corrigeant tes lignes de regex pour effectuer un réelle substitution pour nettoyer la valeur contenue dans $string (si c'est bien ça que tu veux faire) au lieu de tes tests redondants.

    • [^] # Re: Au choix

      Posté par . Évalué à -5.

      $i n'est pas vide, il contient des valeurs, en principe j'ai deja eu a modifier mon regex au niveau du clean, car l'autre que j'avais mensionne ignorait les zeros maintenant il considere les zeros

      • [^] # Re: Au choix

        Posté par . Évalué à 2. Dernière modification le 22/08/15 à 18:01.

        $i n'est pas vide, il contient des valeurs

        Certes, $i contient a minima un espace si on en croit ta sortie -> mais c'est toi qui l'appelle champ vide dans ton post initial.

        j'ai déjà eu a modifier mon regex au niveau du clean

        Comme je l'ai écrit précédemment, ta fonction clean telle qu'écrite dans ton post ne fait pas ce que tu dis.
        Corrige en mettant en place une substitution

        $string=~ s/\s*,\s*//g

        car l'autre que j'avais mensionne ignorait les zeros maintenant il considere les zeros

        ???

        • [^] # Re: Au choix

          Posté par . Évalué à -5.

          meme avec ce regex

          $string=~ s/\s*,\s*//g

          le champ vide est toujours la

          • [^] # Re: Au choix

            Posté par . Évalué à 2.

            Certaines valeurs de $row (probablement les fins de lignes de tes données d'entrées si je comprends bien ce que tu fais) ne répondent donc pas cette regex (au moins une virgule) et ne sont donc pas traités.
            Revoie ta regex pour traiter ce cas.

  • # Aucun rapport...

    Posté par (page perso) . Évalué à 1.

    … mais je suis traumatisé par le if dans ta boucle.

    Tu crées un chaîne de caractères, avec laquelle dans certains cas tu ne vas rien faire, c'est du gâchis.

    Le if serait beaucoup mieux avant si tu veux garder la variable $d:

    if ($i) {
      my $d = "<tr><td>$i</td></tr>\n";
      print $per_line_fh $d;
    }

    voire sans $d et avec le même type de syntaxe:

    print $per_line_fh "<tr><td>$i</td></tr>\n" if $i;
    }
    • [^] # Re: Aucun rapport...

      Posté par . Évalué à -5.

      j'accepte toutes les propositions merci bien
      pour mon proble j'ai finalement rouve la reponse

      sub clean {    
          my $string = shift;
          $string =~ s/^\s+//;
          $string =~ s/\s+$//;
          return $string;
      }
      • [^] # Re: Aucun rapport...

        Posté par . Évalué à -5.

        pourquoi ne prend-t-il pas les valeur 0 en consideration, je suis bloque qu'un peut il me dire ce qu'il ya lieu de changer dans mon regex.

      • [^] # Re: Aucun rapport...

        Posté par (page perso) . Évalué à 1.

        Tu peux tout faire en une seule regex avec un or (|):

        $string =~ s/^\s+|\s+$//g

        ou encore

        $string =~ s/^\s*(.*?)\s*$/$1/;

        Qui veut dire que tu remplace ta chaîne par ce qui est entre parenthèses, ce qui en l’occurrence est tout sauf les blancs en début et fin de chaîne.

        • [^] # Re: Aucun rapport...

          Posté par . Évalué à -5.

          malheureusement ca ne marche pas

          • [^] # Re: Aucun rapport...

            Posté par . Évalué à -6.

            ceci est un peut correct mais il se me revoit un vide a la fin comment pourrai je empecher ce vide

            $string =~ /\s*,\s*/;
            $string =~ /\s*,\s*/;
            • [^] # Re: Aucun rapport...

              Posté par . Évalué à -5.

              je l'ai finalement trouve la solution est la suivante

              my $string = shift;
                  $string =~ /\s*,\s*/;
                  $string =~ s/\s+$//;
                  return $string;
        • [^] # Re: Aucun rapport...

          Posté par . Évalué à 1.

          Tu peux tout faire en une seule regex avec un or (|):

          La doc. indique toutefois que c'est plus lent de recourir au OR que de le faire en deux opérations. Pas forcément très grave, mais il vaut mieux le savoir.

      • [^] # Re: Aucun rapport...

        Posté par . Évalué à 2.

        ou comment reinventer les fonctionnalités de TRIM deja disponible dans PERL

        http://perlmaven.com/trim

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.