Forum Programmation.perl références aux dossiers parents

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-2
5
oct.
2015

salut a tous j'aimerai procede a une refenrence sur un dossier et cela ne me reussi pas peut etre
quelqu'un pourrai m'aide merci bien.

$file1 = shift @ARGV ;    #ligne 24

open my $file1, "<", 'C:\Users\Desktop\SysCompare_v01\CSV\InputData\default_sys.xml';   

open my @files = glob 'C:\Users\Desktop\SysCompare_v01\InputData\*.xml';   #ligne 28

lorsque j'execute il me renvoi l'erreur suivant

C:\Users\Desktop\SysCompare_v01\PerlScript>perl parser.pl default_sys.xml *.xml
Global symbol "$file1" requires explicit package name at parser.pl line 24.
BEGIN not safe after errors--compilation aborted at parser.pl line 28.

C:\Users\Desktop\SysCompare_v01\PerlScript>
  • # Plusieurs trucs bizarres…

    Posté par  . Évalué à 2.

    Ce n'est pas comme ça que fonctionne open, je te conseille de lire un tutoriel quelconque dessus (ou juste perldoc -f open). La syntaxe c'est open my $descripteur, '<', $nom_du_fichier_a_ouvrir.

    De plus, tu déclares avec my une variable ($file1) que tu as déjà utilisée avant (d'où ton message d'erreur), mais de toutes façons, tu confonds nom de fichier et descripteur de fichier. Tu voulais peut-être écrire plutôt :

    open my $fh, "<", $file1

    mais c'est difficile à savoir.

    • [^] # Re: Plusieurs trucs bizarres…

      Posté par  . Évalué à -6.

      J'aimerai qu'il ouvre un fichier se trouvant dans un dossier, c'est cela mon probleme

      • [^] # Re: Plusieurs trucs bizarres…

        Posté par  . Évalué à 3.

        Deux possibilités :

        avec le chemin codé en dur dans le code :

        $file1 = 'c:\chemin\vers\le\fichier.xml'
        open my $file_handler, '<', $file1;

        et avec le chemin, pris en argument de la ligne de commande :

        $file1=shift $argv;
        open my $file_handler, '<', $file1;

        ou plus loin, tu fais un GLOB du dossier pour prendre tous les fichiers,
        il faudra alors boucler sur le tableau @files pour lire le nom de chacun des fichiers.

        • [^] # Re: Plusieurs trucs bizarres…

          Posté par  . Évalué à 2.

          Dit autrement, le nom de fichier doit être passer en dernier argument de open.

          le premier argument (file_handler) est une variable que tu dois fournir à la fonction open, mais que tu ne dois pas initialiser. C'est la fonction open qui lui affectera sa valeur. Ensuite cette variable te servira de référence vers le fichier que tu as ouvert pour lire, écrire, etc … dedans.

          Le nom de fichier n'est utile qu'à l'ouverture, après tu utilises la référence.

          • [^] # Re: Plusieurs trucs bizarres…

            Posté par  . Évalué à 2.

            pour completer ce que dit totof2000

            open my $file_handler,">","chemin/vachement/long/pour/acceder/au/fichier.csv";
            
            print $file_handler "mon premier resultat est : ABCD";
            print $file_handler "mon deuxieme resultat est : EFGH";
        • [^] # Re: Plusieurs trucs bizarres…

          Posté par  . Évalué à -6. Dernière modification le 06 octobre 2015 à 14:56.

          je suis desole ca ne marche pas

          • [^] # Re: Plusieurs trucs bizarres…

            Posté par  . Évalué à -6. Dernière modification le 06 octobre 2015 à 17:57.

            comment je peut splitter cette chaine

            $file1 = 'C:\Users\Desktop\SysCompare_v01\InputData\default_sysdumpdev_150319.xml'
            print( (split('_', $file1,2))[0] . ', ' );

            j'aimerai qu'il me renvoi juste default

          • [^] # Re: Plusieurs trucs bizarres…

            Posté par  . Évalué à 3.

            je suis desole ca ne marche pas

            c'est sur qu'avec cette reponse, on va pouvoir t'aider,

            tu as essayé quoi ?
            ca dit quoi ?

            tu as compris comment on ecrit le open et comment on utilise le file_handler ?

            • [^] # Re: Plusieurs trucs bizarres…

              Posté par  . Évalué à -6. Dernière modification le 06 octobre 2015 à 18:25.

              Neox
              voila tout le code, les fichiers xml se trouvent tous dans le dossier InputData

              #!/usr/local/bin/perl -w                         
              use strict; 
              use warnings; 
              use XML::Twig;
              use Text::CSV;
              use POSIX qw(strftime); 
              use autodie;  
              
              
              my $file1 = shift @ARGV ;
              
               $file1 = 'C:\Users\Desktop\SysCompare_v01\InputData\default_sys_156778.xml';  
              
              open my $file1, '<', $file1; 
              
              
              open my @files = glob 'C:\Users\Desktop\SysCompare_v01\InputData\*.xml';   
              
              @files = grep { $_ ne $file1 } @files if defined $file1;  
              
              
              
              my $date_1 = strftime "%Y%m%d %H:%M:%S", localtime; 
              
              
              
              my $FileResult = 'C:\Users\Desktop\SysCompare_v01\CSV\DATA.csv';
              
              open( my $FhResult, '>', $FileResult );  
              
              
              print $FhResult $date_1, "\n"; 
              
              
              
              my $twig1= XML::Twig->new(    
              
                      twig_handlers => {    
                              'Parameter' => sub {  
              
              my $attr_name = $_->{'att'}->{'name'};                                                         
              
              
                                      print $FhResult $attr_name . ", ";    
                              },
                      },
              );
              
              print $FhResult( (split('_', $file1,2))[0] . ', ' );  
              
              $twig1->parsefile($file1);   
              
              
              for my $file (@files) {  
              
                  my $twig1 = XML::Twig->new(
              
                      twig_handlers => {
              
                          'Parameter' => sub {
              
                              my $attr_value = $_->{'att'}->{'value'} // 'fault';  
              
                              print $FhResult $attr_value . ", ";
                          },
                      },
                  );
              
              
                  print $FhResult ((split( '_', "\n $file", 2 ) )[0] . ', ');
              
                  $twig1->parsefile($file);      
              }
              
              close $FhResult;
              • [^] # Re: Plusieurs trucs bizarres…

                Posté par  . Évalué à 2.

                oui, donc visiblement tu n'as pas compris qui fait quoi dans les bout de code qu'on t'a donné, je me suis arrété apres les 3 premieres lignes

                my $file1 = shift @ARGV ;
                 $file1 = 'C:\Users\Desktop\SysCompare_v01\InputData\default_sys_156778.xml';  
                open my $file1, '<', $file1;

                rien que sur les 3 premieres lignes…

                ligne 1 : ton $file1, c'est une variable prise depuis la ligne de commande
                ligne 2 : finalement non, tu definis $file1 en dur pour lui dire que c'est C:\Users\Desktop…..default_sys_156778.xml'

                ligne 3 : tu n'as pas compris la construction du OPEN
                je le redis ici :

                en supposant que tu veuilles ouvrir, en lecture, le fichier definit à la ligne 1 OU à la ligne 2
                il faut ecrire

                open my $FH,'<',$file1;

                puis quand tu voudras lire une ligne de ce fichier tu liras du $FH et non sur $ile1

                par exemple un peu plus loin tu le fais comme il faut avec FileResult (le fichier) et FHresult (le handler)

                • [^] # Re: Plusieurs trucs bizarres…

                  Posté par  . Évalué à -7.

                  Neox,
                  qu'es ce que tu veus vraiment dire je vais te dire ce code fonctionne sans probleme lorsque les fichiers et mon script se trouvent dans le meme dossier, dire que qu'on m'a donne le code je te remerci bien. comme je suis si bete que je ne peus pas ecrire le moindre code en perl. Merci de la remarque.
                  Mon probleme est que mon script puisse retrouver les fichiers dans un dossier

                  • [^] # Re: Plusieurs trucs bizarres…

                    Posté par  . Évalué à 2.

                    bien,
                    admettons que le code fonctionne malgré les 3 premiers lignes qui ne font rien.

                    tu definis ensuite un tableau avec les fichiers avec

                    open my @files = glob 'C:\Users\Desktop\SysCompare_v01\InputData\*.xml';

                    j'imagine que c'est ca que tu veux remplacer par un autre dossier, pour pouvoir lancer, par exemple :

                    perl tonscript.pl "c:\Users\Desktop\UnAutreDossier\"

                    et bien il faut appliquer ce que tu as appris depuis 3 mois.

                    1°) recuperer l'argument de la ligne de commande dans presenté dans $ARGV

                    2°) l'utiliser dans le open my @files... à la place du chemin en dure.

                    ca donnerait un code qui ressemble à ca :

                    my $MYDIR=shift @ARGV;
                    open my @files = glob $MYDIR.'\*.xml';
                    • [^] # Re: Plusieurs trucs bizarres…

                      Posté par  . Évalué à -6.

                      Salut Neox,
                      pourquoi faut il encore preciser la direction comme tu ecrit ici plus haut
                      ruby
                      perl tonscript.pl "c:\Users\Desktop\UnAutreDossier\"

                      alors que pour faire demarre un script dans perl command-line il faut au prealable trouve le dossier dans lequel se trouve le script a savoir du genre
                      ruby
                      c:\Users\Desktop\Dossier ou le script se trouve> perl .........

                      • [^] # Re: Plusieurs trucs bizarres…

                        Posté par  . Évalué à 2.

                        pour que toi tu cherches à lancer le script qui se trouve dans

                        c:\Users\Desktop\Dossier ou le script se trouve> perl lescript.perl fichier.xml

                        alors que moi je lances le script, evidemment depuis le dossier ou il est
                        mais avec des fichiers xml qui se trouvent ailleurs, et c'est ce chemin que je fournit en ARGUMENT du script.pl

                        c:\Users\Desktop\Dossier ou le script se trouve> perl lescript.pl "c:\Users\Desktop\Dossier ou les datas se trouvent*.xml"

                        chemin que tu recuperes dans ARGV à l'interieur du script, et qui te permet alors de faire ton GLOB pour avoir ton tableau de fichiers xml (@files)
                        de faire la boucle de traitement sur $file1 pris parmis @files

                        • [^] # Re: Plusieurs trucs bizarres…

                          Posté par  . Évalué à -6.

                          voila j'ai fait comme tu me l'as demande il me renvoi cette erreur

                          C:\Users\Desktop\SysCompare_v01\PerlScript>perl parser.pl "C\Us
                          ers\Desktop\SysCompare_v01\InputData"
                          Couldn't open C:\Users\Desktop\SysCompare_v01\InputData:
                          Permission denied at parser.pl line 65.
                          at parser.pl line 65.
                          
                          C:\Users\Desktop\SysCompare_v01\PerlScript>

                          la ligne 65 si tu regardes le script est :

                          $twig1->parsefile($file1);
                          • [^] # Re: Plusieurs trucs bizarres…

                            Posté par  . Évalué à 2.

                            et tu remplis bien ton @files comme proposé un peu plus tot ?

                            my $MYDIR=shift @ARGV;
                            open my @files = glob $MYDIR.'*.xml';

                            suivi d'une boucle pour traiter $file1 pris dans @files ?

                            ou tu as laisser ton

                            my $files1=shift @ARGV

                            qui tente d'ouvrir un fichier, là ou vient de lui donner un DOSSIER.

                            • [^] # Re: Plusieurs trucs bizarres…

                              Posté par  . Évalué à -6.

                              voila ce qu'il me revoi, si j'ai bien compris je dois encore declare ma variable $file1

                              C:\UsersDesktop\SysCompare_v01\PerlScript>perl parser.pl "C\Us
                              ers\IBM_ADMIN\Desktop\SysCompare_v01\InputData"
                              Global symbol "$file1" requires explicit package name at parser.pl line 2
                              9.
                              Global symbol "$file1" requires explicit package name at parser.pl line 2
                              9.
                              Global symbol "$file1" requires explicit package name at parser.pl line 6
                              3.
                              Global symbol "$file1" requires explicit package name at parser.pl line 6
                              5.
                              Execution of parser_selbst.pl aborted due to compilation errors.
                              
                              C:\Users\Desktop\SysCompare_v01\PerlScript>
                              • [^] # Re: Plusieurs trucs bizarres…

                                Posté par  . Évalué à 2.

                                ou relire les commentaires precedents,

                                y a des lignes qui ne font rien,
                                qui remplissent $file1
                                qui est tout de suite apres remplacer par autre chose.

                                ensuite la logique de ta demarche veut que dans l'ordre :
                                - tu recuperes le dossier contenant les xml à partir de @ARGV, disons dans une variable $MYDIR
                                - tu recuperes la liste des fichiers contenus dans ce $MYDIR pour stocker cette liste dans un tableau @FILES
                                - tu parcours ce tableau pour creer $FILE1 et effectuer le traitement qui t'interesse

                            • [^] # Re: Plusieurs trucs bizarres…

                              Posté par  . Évalué à 3.

                              open my @files = glob $MYDIR.'*.xml';

                              Juste une remarque par rapport à une erreur qui se propage depuis tout à l'heure : faut enlever le open en trop ici, et ouvrir ensuite chaque fichier séparément dans une boucle sur @files (si c'est vraiment le but de la manœuvre).

                              • [^] # Re: Plusieurs trucs bizarres…

                                Posté par  . Évalué à 2.

                                je laisse volontairement certaines erreurs de l'utilisateur car à l'entendre son code fonctionne mais ne fait pas ce qu'il veut.

                                le but etant d'apprendre à l'utilisateur "comment pecher ?", pour devenir autonome, plutot que de donner de la nourriture tous les jours.

                                dans le meme genre y a le

                                my $file1=shift @ARGV;

                                suivit quelques lignes plus loin par

                                open my $file1,<,"c:\chemin\vers\fichier"

                                encore suivi un peu plus loin du fameux
                                open my @files= glob….

                                ou l'on imagine qu'il va remplacer le $file1 par le contenu de @files…

                                • [^] # Re: Plusieurs trucs bizarres…

                                  Posté par  . Évalué à 2.

                                  car à l'entendre son code fonctionne mais ne fait pas ce qu'il veut.

                                  En même temps, avant qu'il ajoute ces lignes au début, peut-être que ça faisait quelque chose, c'est sans doute ce qu'il veut dire, j'imagine.

                                  Je comprend ta démarche pédagogique, mais je pense que le mieux ce serait qu'henri lise un tutoriel en français qui reprend les bases de la programmation en Perl dans l'ordre, parce que sinon, forcément, on bloque sur des trucs de base.

                                  • [^] # Re: Plusieurs trucs bizarres…

                                    Posté par  . Évalué à -6.

                                    Anaseto,
                                    merci bien du tutoriel, mais je voulais justedire que meme les experes programmeurs sont parfois confronte a des problemes. on peu bien pouvoir Programmer et etres confronter a certains petit problem.
                                    je suis pas un bon programmeur je fait de mon mieu et mon sourci ici est que j'aimerai que mon code aille chercher ler fichier se trouvant dans un dossier und qu'il les traitent et ensuite stocke le fichier de sorti dans un autre dossier.
                                    comme vous l'avez remarque le $file1 et @files sont dans un meme dossier.
                                    sans toute fois aller cherche le fichiers xml dans un dossier lorsque ce script se trouve dans le meme dossier que les fichier xml il effectue tres bien son boulot, juste pour dire que ce code fonctionne tres bien.
                                    c'est maintenant un probem de direction qui me menace.
                                    Merci bien

                                    • [^] # Re: Plusieurs trucs bizarres…

                                      Posté par  . Évalué à 2.

                                      si la direction en est à te menacer, va chercher le livre de programmation PERL.

                                      parce qu'à notre niveau on ne peut plus grand chose.

                                      on t'a montré :

                                      • comment passer un parametre au lancement de ton script :

                                      perl monscript.pl monparametre

                                      • comment le recuperer avec le @ARGV

                                      $MONPARAMETRE=shift @ARGV

                                      • comment ouvrir un fichier :

                                      open my $FH,'<',$file1
                                      ou
                                      open my $FH,'<','C:\chemin\vers\le\fichier.xml'

                                      • comment obtenir une liste de fichier à partir d'un chemin connu

                                      glob @FILES 'c:\chemin\connu\*.xml'

                                      il te faut maintenant composer avec tout cas pour :

                                      • lire le nom du dossier source sur la ligne de commande (ah tient, comme pour lire monparametre) ca devriendra la variable, disons $SOURCE
                                      • lire le nom du dossier destination sur cette meme ligne de commande (ben faut lire de 2e parametre de la ligne de commande), ca deviendra la variable $DESTINATION
                                      • remplir le tableau @FILES avec les fichiers contenus dans le dossier $SOURCE

                                      puis on en revient au basic elementaire :

                                      faire une boucle sur tous les fichiers contenus dans @FILES
                                      dans cette boucle
                                      faire le traitement, qui ecrira sa sortie dans $DESTINATION

                                      • [^] # Re: Plusieurs trucs bizarres…

                                        Posté par  . Évalué à -6.

                                        pourquoi il ne trouve pas le fichier suivant a la ligne 66

                                        $twig1->parsefile($file1); #ligne 66
                                        C:\Users\Desktop\SysCompare_v01\PerlScript>perl parser.pl defau
                                        lt_sysdumpdev_150319.xml *.xml
                                        Couldn't open default_sys.xml:
                                        No such file or directory at parser.pl line 66.
                                         at parser.pl line 66.
                                        
                                        C:\Users\Desktop\SysCompare_v01\PerlScript>

Suivre le flux des commentaires

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