Forum Programmation.perl Concatenation

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

Salut j'ai un petit souci de concatenation, j'ai mon code qui me retourne des values avec

        print $per_line_fh  map {clean($_)} @$row ;

de par et d'autre j'aimerai que lors de la sortie ceci me retourne avec certains characteres de html par et d'autre, a savoir:

print $per_line_fh "<tr><td>map {clean($_)} @$row</td></tr>" ;
malheureusement lorsque je je tape le Charactere "" la commande perl map n'est plus active et donc le resultat n'est plus ce que je j'attend.

je sais pas si quelqu'un ici pourrai m'aider je pense que c'est un petit souci de concatenation.

NB: si je me suis mal explique, pose moi des questions, erpargne moi les injures qui ne permet pas d'avance, si je le dit c'est parceque il ya des gens sur ce forum qui m'ont lance des mots deplace la derniere fois.
Merci

  • # tes chaines et tes variables

    Posté par . Évalué à 2.

    il est normal que ta variable map… ne soit pas prise en compte elle se trouve DANS les "…"

    essaie en ne mettant que tes chaines de caractere entre " " puis en laissant les variables telles quelles.

    • [^] # Re: tes chaines et tes variables

      Posté par . Évalué à -5.

      J'avais deja eu a essayer ce que tu dis a savoir

      print $per_line_fh "<tr><td>"map {clean($_)} @$row"</td></tr>";

      malheureusement ca ne fonctionne pas.

      • [^] # Re: tes chaines et tes variables

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

        Ne grille pas d'étapes, essaie de comprendre les bases du langage avant d'aller plus loin.

      • [^] # Re: tes chaines et tes variables

        Posté par . Évalué à 2.

        et avec un espace autour des chaines/variables ?
        pour bien differencier les chaines des variables ?

        print $per_line_fh "<tr><td>" map {clean($_)} @$row "</td></tr>";

        sinon d'apres notre moteur de recherche favori
        http://lmgtfy.com/?q=perl+variables+concatenate+string

        on trouve quelques exemples ici : http://www.perlmonks.org/?node_id=32418

        qui parle d'utiliser le point (.) et peut-etre de faire la concatenation avant le print.

        ex :

        $masortie=$per_line."<tr><td>".map {clean($_)} @$row."</td></tr>";
        print $masortie;
      • [^] # Re: tes chaines et tes variables

        Posté par . Évalué à -5.

        voila l'erreur qu'il me revois sachant que la ligne 51 est la suivante

        print $per_line_fh "<tr><td>"map {clean($_)} @$row"</td></tr>";
            C:\Users\Documents\probe\wo>perl systeme1.pl DATA2.csv
            String found where operator expected at systeme1.pl line 51, near "$row"</td></tr>""
                    (Missing operator before "</td></tr>"?)
            "my" variable $string masks earlier declaration in same statement at systeme1.pl line 58.
            "my" variable $string masks earlier declaration in same scope at systeme1.pl line 59.
            "my" variable $string masks earlier declaration in same scope at systeme1.pl line 60.
            syntax error at systeme1.pl line 51, near ""<tr><td>"map"
            Global symbol "$row" requires explicit package name at systeme1.pl line 51.
            syntax error at systeme1.pl line 51, near "$row"</td></tr>""
            Global symbol "$per_line_fh" requires explicit package name at systeme1.pl line 52.
            Global symbol "$per_line_fh" requires explicit package name at systeme1.pl line 53.
            syntax error at systeme1.pl line 54, near "}"
            syntax error at systeme1.pl line 61, near "}"
            Execution of systeme1.pl aborted due to compilation errors.
            C:\Users\Documents\probe\wo>
        
        • [^] # Re: tes chaines et tes variables

          Posté par . Évalué à 2.

          ah ben voila,

          String found where operator expected at systeme1.pl line 51, near "$row"""
          (Missing operator before ""?)

          il dit clairement qu'il manque un operateur juste avant la chaine ""

          bon il dit aussi que le code est fonctionnel mais buggé :

          "my" variable $string masks earlier declaration in same statement at systeme1.pl line 58.

          ou bien encore

          Global symbol "$per_line_fh" requires explicit package name at systeme1.pl line 52.

          • [^] # Re: tes chaines et tes variables

            Posté par . Évalué à -5.

            d'apres le lien que tu m'as envoye j'ai tout essaye malheureusement ce ne fonctionne pas, voila les essais

               #print $per_line_fh "<tr><td>".map {clean($_)} @$row."</td></tr>";
                #my $masortie = "<tr><td>". map {clean($_)} @$row ."</td></tr>";
                my $a = '<tr><td>';
                my $b = map {clean($_)} @$row;
                my $c = '</td></tr>';
                my $d = "$a$b$c";
               #print $per_line_fh join "", "<tr><td>", map {clean($_)} @$row, "</td></tr>";
                print $per_line_fh $d;
                #print $per_line_fh $masortie;

            par ailleur il ya plusieur valeurs dans:

            map {clean($_)} @$row

            ca veut dire qu'au sortie j#attend quelque chose du genre

            <tr><td>fault</td></tr>
            <tr><td>3456</td></tr>
            <tr><td>60000</td></tr>
            <tr><td>value</td></tr>
            <tr><td>80000</td></tr>

            • [^] # Re: tes chaines et tes variables

              Posté par . Évalué à 2. Dernière modification le 13/08/15 à 14:20.

              ah oui, mais non

              si tu fais le print $per_line_fh $d
              tu vas obtenir le contenu de map {clean($_)} @$row entre le <tr><td> et le </td></tr>
              soit ca :

              <tr><td>fault 3456 6000 value 8000</td></tr>

              ce qu'il te faut maintenant c'est une boucle qui va lire chaque valeur dans map…
              pour le sortir ligne par ligne

              • [^] # Re: tes chaines et tes variables

                Posté par . Évalué à -5.

                voila a quoi ressemble ma bouble mais malheureusement elle n'a que choisi une value qu'elle me revoit plusieurs fois

                for my $i (map {clean($_)} @$row) {
                    my $a = '<tr><td>';
                    my $b = map {clean($_)} @$row;
                    my $c = '</td></tr>';
                    my $d = "$a$b$c\n";
                    print $per_line_fh $d;
                    }
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                <tr><td>374</td></tr>
                
                • [^] # Re: tes chaines et tes variables

                  Posté par . Évalué à -5.

                  je pense avoir trouve je te presente la solution dans un instant

                  • [^] # Re: tes chaines et tes variables

                    Posté par . Évalué à -5. Dernière modification le 13/08/15 à 15:05.

                    je pense avoir trouve je te presente la solution dans un instant

                        for my $i (map {clean($_)} @$row) {
                        my $a = '<tr><td>';
                        my $c = '</td></tr>';
                        my $d = "$a$i$c\n";
                        print $per_line_fh $d;
                        }

                    mais li me donne encore un resultat a travailler car a la fin il me produit encore des caracteres supplementaires si tu observes a la fin il ya des caracteres sans valuer. et c'est encore un probleme

                    <table>
                    <tr><td>10000
                    </td></tr>
                    <tr><td>10000
                    </td></tr>
                    <tr><td>0
                    </td></tr>
                    <tr><td>50
                    </td></tr>
                    <tr><td>1
                    </td></tr>
                    <tr><td>
                    </td></tr>
                    </table>

                    • [^] # Re: tes chaines et tes variables

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

                      Pour tes valeurs nulles, il ne faut pas faire de print si la valeur de $i est nulle.

                      Ça, ça devrait le faire :

                          for my $i (map {clean($_)} @$row) {
                              my $a = '<tr><td>';
                              my $c = '</td></tr>';
                              my $d = "$a$i$c\n";
                              print $per_line_fh $d if ($i);
                          }
                      

                      Note le if ($i) sur la ligne de print.Tout simplement, ça ne fait fait le print que si $i n'est pas undef, 0 ou une chaîne vide.

                      Tu peux aussi rajouter un chomp $i juste après la ligne for car j'ai l'impression que ta fonction clean renvoie des valeurs avec un retour à la ligne à la fin.

                      It's a fez. I wear a fez now. Fezes are cool !

                      • [^] # Re: tes chaines et tes variables

                        Posté par . Évalué à -5.

                        Salut Framasky,
                        Merci bien tout est regle comme je le souhaitais

                        • [^] # Re: tes chaines et tes variables

                          Posté par . Évalué à -5.

                          J'aimerai savoir comment faire donne une direction a ma sortie "print"
                          c'est a dire que j'ai un dossier quelque par sur C:\Users\Documents\probe par exemple
                          et j'aimerai que lorsque j'execute mon code code.pl que toute ce que mon code
                          me revoit soit stocke dans un dossier par exemple "Probe".
                          je sais comment faire pour traite un Fichier se trouvant dans un dossier sur C: du genre

                          my $FileResult = 'C:\Users\Documents\probe\DATA2.csv';
                              open( my $FhResult, '>', $FileResult );
                          • [^] # Re: tes chaines et tes variables

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

                            Tu fais ça dans le mauvais sens j'ai l'impression.

                            Avec

                            my $FileResult = 'C:\Users\Documents\probe\DATA2.csv';
                                open( my $FhResult, '>', $FileResult );
                            

                            Tu vas écraser ton fichier DATA2.csv, alors que j'ai plutôt l'impression que c'est le fichier qui te donne les résultats à mettre en forme.

                            Pour lire DATA.csv :

                            my $FileInput = 'C:\Users\Documents\probe\DATA2.csv';
                                open( my $FhInput, '<', $FileInput );
                            

                            Et ensuite, pour écrire dans C:\Users\Documents\probe\result.html :

                            my $FileOutput = 'C:\Users\Documents\probe\result.html';
                                open( my $per_line_fh, '>', $FileOutput );
                            

                            C'était bien le sens de ta question ?

                            Ah, et sinon, pense à mettre des die quand tu ouvres un fichier, juste au cas où :

                            open( my $per_line_fh, '>', $FileOutput ) or die "Y a un problème pour ouvrir $FileOutput : $!";
                            

                            Tu auras alors un message vite compréhensible (Y a un problème pour ouvrir C:\Users\Documents\probe\result.html) avec la raison pour laquelle perl n'a pas réussi à l'ouvrir (c'est le $! qui donne ça).

                            It's a fez. I wear a fez now. Fezes are cool !

                            • [^] # Re: tes chaines et tes variables

                              Posté par . Évalué à -5.

                              Merci bien c'est pigé

                            • [^] # Re: tes chaines et tes variables

                              Posté par . Évalué à -6.

                              Salut Framasky,

                              j'ai texte l'exemple donc tu as site plus haut a savoir pour ecrire un fichier.
                              la il ne fonctionne pas car je pense a ma sortie je suis sense recevoir plusieurs Fichiers
                              il me renvoi qu'un fichier de son choix.
                              voila ce que j'ai tape dans mon code

                                  open my $per_line_fh, ">", 'C:\Users\Documents\probe\wo\file2\$file.html' or die "Can't open per-line file $file: $!\n";

                              quand il est de la sorte, je recois tous les fichiers

                              open my $per_line_fh, ">", '$file.html' or die "Can't open per-line file $file: $!\n";
                              • [^] # Re: tes chaines et tes variables

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

                                Dans l'adresse de ton fichier dans lequel écrire, mets des " et pas des ', sinon ton $file n'est pas interprêté, donc c'est toujours le même fichier dans lequel il écrit (et il écrase ce qu'il y avait dedans).

                                It's a fez. I wear a fez now. Fezes are cool !

                                • [^] # Re: tes chaines et tes variables

                                  Posté par . Évalué à -5.

                                  meme avec le "" ca ne marche pas je l'avais aussi essaye

                                  • [^] # Re: tes chaines et tes variables

                                    Posté par . Évalué à 2.

                                    parce qu'il faudrait l'ecrire comme ca :

                                    open my $per_line_fh, ">", $file.".html" or die "Can't open per-line file $file: $!\n";

                                    car tu veux concatener la variable $file à la chaine de caractere ".html"

                                    • [^] # Re: tes chaines et tes variables

                                      Posté par . Évalué à -5.

                                      Malheureusement ce ne marche pas

                                      • [^] # Re: tes chaines et tes variables

                                        Posté par . Évalué à 2.

                                        la commande de base etant celle là :

                                        open( my $per_line_fh, '>', $FileOutput );

                                        il doit manquer des parentheses à ce que tu veux faire

                                        open (my $per_line_fh, ">", $file.".html") or die "Can't open per-line file $file: $!\n";

                                        si, meme si c'est un peu tard pour ton projet, je te recommande de lire ca :
                                        http://shop.oreilly.com/product/0636920018452.do

                                        en 3 semaines je savais programmer en perl au moins sur les trucs de bases,
                                        ouvrir/ecrire/fermer un fichier,
                                        faire des boucles,
                                        des remplacements de chaines,
                                        des operations,
                                        des sorties structurées..

                                        • [^] # Re: tes chaines et tes variables

                                          Posté par . Évalué à -5.

                                          Salut Neox,
                                          je pourrai jamais pretendre que je sais programmer, mais je dirais toujours j'ai des connaissances de base.
                                          si tu relis mes intervension avant les tiennes tu verras bien quel est mon veritable probleme.

                                          • [^] # Re: tes chaines et tes variables

                                            Posté par . Évalué à 2.

                                            ah oui, j'ai oublié de preciser le chemin ou va se ranger le fichier
                                            ca reste une concatenation de chaine et de variable

                                            open (my $per_line_fh, ">", "c:\users\henri\mesdocuments\".$file.".html") or die "Can't open per-line file $file: $!\n";

                                            pour avoir autant de fichier .html que de $file d'origine
                                            et ranger tout ca dans c:\users\henri\mesdocuments\

                                            • [^] # Re: tes chaines et tes variables

                                              Posté par . Évalué à -5.

                                              Salut Neox
                                              malheureusement ca ne marche pas

                                              • [^] # Re: tes chaines et tes variables

                                                Posté par . Évalué à 2.

                                                et sinon, ca dit quoi ?
                                                parce que "ca ne marche pas, ca n'aide pas"

                                                la documentation de la fonction OPEN
                                                http://perldoc.perl.org/functions/open.html

                                                • [^] # Re: tes chaines et tes variables

                                                  Posté par . Évalué à -5.

                                                  Je dirai le probleme serai les "" parceque lorsque je les placent comme tu me conseil il ya les textes qui sont blaichit

                                                  • [^] # Re: tes chaines et tes variables

                                                    Posté par . Évalué à 2. Dernière modification le 19/08/15 à 11:42.

                                                    peux-tu nous copier/coller l'erreur que tu as quand tu lances avec telle ou telle combinaison dans ton OPEN ?

                                                    ca permettrait d'en savoir plus.
                                                    exemple

                                                    avec open ... ">","$file.html" ca t'ecrit tout dans un fichier $file.html au lieu de remplace $file par le nom du fichier obtenu dans la boucle precedente ?

                                                    avec open ... ">","c:\mesdocuments\masortie.html") ca n'ecrit rien dans c:\mesdocuments\masortie.html…

                                                    exemple de code qui fonctionne (sur un linux), les 3 lignes de open sont valides, j'en ai mis 2 en commentaires pour exemple.

                                                    #!/usr/bin/perl
                                                    
                                                    my $lechemin ="/tmp/";
                                                    my $lefichier="mytest2.txt";
                                                    
                                                    open ( $myfile , ">" , "/tmp/".$lefichier) or die "impossible d'ouvrir le fichier $!";
                                                    #open ( $myfile , ">" , $lechemin."mytest2.txt") or die "impossible d'ouvrir le fichier $!";
                                                    #open ( $myfile , ">" , $lechemin.$lefichier) or die "impossible d'ouvrir le fichier $!";
                                                    
                                                    print $myfile "titi";
                                                    
                                                    close $myfile;
                      • [^] # Re: tes chaines et tes variables

                        Posté par . Évalué à -5.

                        Salut Framasky,
                        je pense que j'avais oublie de mensionner que certaines value sont egal a 0
                        j'ai retouche mon clean et il travaille bien a la seul difference que j'obtien a la fin de mon tableau un champ vide.

                            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 tu 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.

                           <tr><td> 0</td></tr>
                           <tr><td> 50</td></tr>
                           <tr><td> 1</td></tr>
                           <tr><td> </td></tr>
                           </table>
                          </body>
                        • [^] # Re: tes chaines et tes variables

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

                          Ton $i n'est pas une chaîne vide : il y a une espace. Donc :

                          print $per_line_fh $d if ($i && $i ne ' ');
                          

                          Ou plus générique, pour éviter que ça print si y a un caractère d'espacement (espace, tabulation, etc) ou plusieurs :

                          print $per_line_fh $d if ($i && $i !~ m/^\s+$/);
                          

                          It's a fez. I wear a fez now. Fezes are cool !

  • # map est fait pour ca

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

    map permet d'appliquer une fonction à chaque élément d'une liste, il est donc dommage de boucler autour du résultat de map alors que tu peux continuer à l'utiliser. Tu peux en effet appliquer tout le code que tu veux à map.

    Ensuite, l'opérateur de concaténation pour perl est le point si je me souviens bien.

    Donc je pense que tu veux:

    print $per_line_fh  map {'<tr><td>' . clean($_) . '</td></tr>'} @$row ;

    Maintenant si tu ne veux pas de lignes vides, il va falloir légèrement complexifier le map, mais tu peux t'en sortir en te basant sur quelque chose comme:

    print $per_line_fh  map {$tmp = clean($_); if ... } @$row ;

Suivre le flux des commentaires

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