IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

[DEBUTANT again]Arguments ligne de commande


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut [DEBUTANT again]Arguments ligne de commande
    Bonjour à tous,

    Cela faisait un moment que je n'avais pas touché à PERL et il me le fait bien comprendre. On dirait une vieille fille acariatre !

    J'écris un script afin de recense toutes les variables incluses dans des fichiers fortran de common (ce sont mes includes en fait). Avec ceci, je souhaite tester un autre répertoire contenant tous les includes de ma boîte en cherchant d'éventuels doublons.

    Voici le code que j'ai pondu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
     
    #!/usr/bin/perl
    ##########################################
    # MAIN                                   #
    ##########################################
    $hslinc = "/vobs/per/hsp/HSL/INC";
    $clist  = $hslinc."/clist.log";
    $rlist  = $hlsinc."/rlist.log";
    $path   = $ARGV[0];
    &list_commons($path);
    &check_commons;
    ##########################################
    # list_commons                           #
    # role;   lists all commons in HSLINC    #
    # input:  none                           #
    # output: none                           #
    ##########################################
    sub list_commons{
      #Input parameters:
      #a folder to scan containing include files
      my($file);
      #Open file which lists all commons included 
      #in input directory given by user
      open(CLIST,">".$hslinc."/clist.log") || 
             die "Sorry, I cannot create ".$clist.".\n";
      #Go to input director
      $path = $_[0];
      chomp($path);
      if(-d $path){
        chdir($path) || die "Sorry, I cannot cd to".$path.".\n";
        foreach $file (<*.h>) {
          open(FILTMP,$file) || 
                 die "Sorry, I cannot read ".$file.".\n";
          while (<FILTMP>){
            chomp;
            if ($_ =~ /^     COMMON\//*/){#pas sur de ce regexp...
              #traitement de SPLIT a faire sur la liste des commons
              #sur cette ligne et les suivantes
            }
          }
          close(CLIST);
        }
      }
      else{
        print $path."is not a directory\n";
      }
    }
     
    ##########################################
    # check_commons                          #
    # role;   lists all commons in HSLINC    #
    # input:  none                           #
    # output: none                           #
    ##########################################
    sub check_commons{
      chdir($hslinc);
      open(CLIST,$clist) || 
             die "Sorry, I cannot read ".$clist."\n";
      #TANT_QUE CLIST n'est pas lu entièrement REPETER
      #  Lire mot;
      #  chomp($word);
      #  system("grep -w $word * > $rlist");
      #FIN_TANT_QUE
    }
    Comme vous le voyez, il n'est pas fini mais ce n'est pas le problème. J'essaye de simplement tester ce que j'ai déjà fait avec l'appel :
    > perl check_commons.pl /home/av_hsp/VALIDATION_SOGETI/FEP_GV10/3/VALID/FLIPTEST/SRC/INCLUDE
    Can't modify not in scalar assignment at check_commons.pl line 5, near ""/vobs/per/hsp/HSL/INC";"
    BEGIN not safe after errors--compilation aborted at check_commons.pl line 31.
    Je ne comprends pas vraiment cette erreur...

    Je récapitule :
    • un "main"
    • deux subroutines appelées
      • list_commons qui liste toutes les variables déclarées
      • check_commons qui vérifie les doublons
    En fait check_commons, pour le moment en tout cas, ne retournera dans le fichier RLIST seulement la sortie de la commande UNIX
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -w $variable *.h > $rlist
    Voilà, je vois bien que j'ai du m...der quelque part mais vu que je suis obligé de faire cela en plus du reste et que c'est censé me faciliter la vie (631 fichiers à passer en revue alors pour faire ce taf à la main)...

    Merci d'avance
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  2. #2
    Membre Expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Par défaut
    1ere ligne de code : on ecrit #! et pas !#

    erreur toute bete !

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Si tu reviens au Perl après une longue absence, je te suggère de jeter un coup d'oeil à mon post "Essentiel ...", et en particulier à la section sur le pragma "strict". Ton script fait déjà des trucs pas très catholiques avec la variable $path (pour l'instant le résultat est correct, mais très fragile). Il vaudrait mieux que tu utilises des variables lexicales (déclarées avec my() ). Par ailleurs tu as un FILTMP et un FLITMP dont je suppose qu'ils devraient être la même chose.

    --
    Jedaï

  4. #4
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    oups... ma dyslexie m'a repris donc... Et je vous jure que dans le bureau on s'y est tous mis mais bon, entre tronqués du bulbe.

    M'enfin.

    Oui, je connais les my(). Mais je ne sais pas si c'est vraiment là le problème. On dirait que les arguments ne sont pas passés. Pourtant $ARGV[0] existe si jeune (et déjà) m'abuse. (Désolé pour le jeu de mots).

    Pour le my(), j'ai juste à ajouter au début du script une déclaration comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my(var1, var2,..., varn)
    C'est cela ?

    Je vais m'y repencher après un café, cela devrait aider.

    Merci en tout cas.

    [EDIT]
    Après avoir corrigé les erreurs mentionnées plus haut, le script me crée bien le fichier clist.log. C'est déjà cela de pris... Je continue
    [/quote]
    [/EDIT
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  5. #5
    Membre émérite
    Avatar de panda31
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2003
    Messages : 670
    Par défaut
    C'est re-moi.

    J'ai remanié. Mais ca marche pas. Normal il y a des erreurs me direz-vous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #!/usr/bin/perl
    use strict;
    ##########################################
    # MAIN                                   #
    ##########################################
    $path   = $ARGV[0];
    print "Beginning scan...\n"
    $hslinc = "\/vobs\/per\/hsp\/HSL\/INC";
    $rlist  = "$hlsinc\/rlist.log"; 
    print "Listing commons...\n";
    &list_commons($path);
    print "List done.\n";
    print "Checking commons.\n";
    &check_commons;
    print "Check done.\n";
    ##########################################
    # list_commons                           #
    # role;   lists all commons in HSLINC    #
    # input:  none                           #
    # output: none                           #
    ##########################################
    sub list_commons{
      #Input parameters:
      #a folder to scan containing include files
      my($line,$var,$file);
      #Go to input directory
      if(-d $path){
        chdir($path) || 
          die "Sorry, I cannot cd to".$path.".\n";
        foreach $file (<*.h>) {
          open(FILTMP,$file) || 
            die "Sorry, I cannot read ".$file.".\n";
          while (<FILTMP>){
            chomp;
            if ($_ =~ /^COMMON\/*|^$/){
              #traitement de SPLIT a faire sur la liste des commons
              #sur cette ligne et les suivantes
              $line = $_;
              $line =~ s/^COMMON\/*\/ //;
              print "$line\n";
              @variables = split(',',$line);
            }
          }
        }
      }
      else{
        print $path."is not a directory\n";
      }
    }
     
    ##########################################
    # check_commons                          #
    # role;   lists all commons in HSLINC    #
    # input:  none                           #
    # output: none                           #
    ##########################################
    sub check_commons{
      my($var);
      chdir($hslinc);
      foreach $var (@variables){
        chomp($var);
        system("grep -w $word * > $rlist");
      }
    }
    Voici le message d'erreurs.

    /vobs/per/hsp/HSL/INC> perl check_commons.pl /home/av_hsp/VALIDATION_SOGETI/FEP_GV10/3/VALID/FLIPTEST/SRC/INCLUDE
    Global symbol "$path" requires explicit package name at check_commons.pl line 8.
    Scalar found where operator expected at check_commons.pl line 11, near "$hslinc"
    (Missing semicolon on previous line?)
    syntax error at check_commons.pl line 11, near "$hslinc "
    Global symbol "$hslinc" requires explicit package name at check_commons.pl line 11.
    Global symbol "$rlist" requires explicit package name at check_commons.pl line 12.
    Global symbol "$hlsinc" requires explicit package name at check_commons.pl line 12.
    Global symbol "$path" requires explicit package name at check_commons.pl line 14.
    Global symbol "$path" requires explicit package name at check_commons.pl line 30.
    Global symbol "$path" requires explicit package name at check_commons.pl line 31.
    Global symbol "$path" requires explicit package name at check_commons.pl line 32.
    BEGIN not safe after errors--compilation aborted at check_commons.pl line 34.
    Dès que ce script marche, je le mets sur developpez.com dans les sources Perl, ce sera une Graaaaaaaaade satisfaction !
    Michaël Mary
    Consultant PLM dans une société de conseil toulousaine
    Auditeur CNAM-IPST depuis septembre 2008
    "Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live."
    John F. Woods
    mon cv et mon domaine et mon blog
    Aucune question technique par MP, svp

  6. #6
    Membre Expert
    Avatar de Jim_Nastiq
    Homme Profil pro
    Architecte, Expert Flex
    Inscrit en
    Avril 2006
    Messages
    2 335
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte, Expert Flex
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 335
    Par défaut
    tu utilise use strict donc devant la déclaration de variable tu met my

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $path   = $ARGV[0];
    my $hslinc;
    etc...
    et il manque un ";" apres ton 1er print

    Pensez vraiment à effectuer une recherche avant de poster, ici et sur un moteur de recherche! c'est la moindre des choses
    Pensez au tag

    Mon Blog sur la techno Flex
    Ma page sur Developpez.com

    Jim_Nastiq

  7. #7
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Et il y a d'autres petits problèmes potentiel dans ton code.
    Voici comment je réécrirais ton code en style "moderne" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #!/usr/bin/perl
    use strict;
    use warnings;
     
    ##########################################
    # MAIN                                   #
    ##########################################
    my $path = shift;
    print "Beginning scan...\n";
    my $hslinc = '/vobs/per/hsp/HSL/INC';
    my $rlist  = "$hslinc/rlist.log";
    print "Listing commons...\n";
    my @variables = list_commons($path);
    print "List done.\n";
    print "Checking commons.\n";
    check_commons(@variables);
    print "Check done.\n";
     
    ##########################################
    # list_commons                           #
    # role;   lists all commons in HSLINC    #
    # input:  include folder                 #
    # output: none                           #
    ##########################################
    sub list_commons {
     
        #Input parameters:
        #a folder to scan containing include files
        my $inc_path = shift;
     
        #Output:
        #Variable names
        my @vars;
     
        #Go to input directory
        if ( -d $inc_path ) {
            chdir($inc_path)
              or die "Sorry, I cannot cd to $inc_path : $!.\n";
            while ( defined( my $file = glob('*.h') ) ) {
                open my ($filtmp), '<', $file
                  or die "Sorry, I cannot read $file : $!.\n";
                while ( my $line = <$filtmp> ) {
                    chomp($line);
                    if ( $line =~ m{^COMMON/*|^$} ) {
     
                        #traitement de SPLIT a faire sur la liste des commons
                        #sur cette ligne et les suivantes
                        $line =~ s{^COMMON/*/ }{};
                        print "$line\n";
                        push @vars, split( ',', $line );
                    }
                }
            }
        }
        else {
            print "$path is not a directory\n";
        }
     
        return @vars;
    }
     
    ##########################################
    # check_commons                          #
    # role;   lists all commons in HSLINC    #
    # input:  variable names                 #
    # output: none                           #
    ##########################################
    sub check_commons {
        my @vars = @_;
     
        chdir($hslinc);
        foreach my $var (@vars) {
            system("grep -w $var * > $rlist");
        }
    }
    Garanti sans faute de syntaxe, non garanti sans bug, vu que je n'ai pas vraiment idée de ce que tu veux faire.

    --
    Jedaï

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. taille arguments ligne de commande
    Par denispir dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 20/02/2013, 12h48
  2. [DEBUTANT] Ligne de commande avec ShellExecute()
    Par alainpeniche dans le forum Windows
    Réponses: 3
    Dernier message: 22/08/2005, 11h08
  3. [Debutant(e)]Lancer un exe en ligne de commande
    Par MASSAKA dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 18/05/2004, 14h54
  4. Réponses: 3
    Dernier message: 07/04/2003, 20h06
  5. Récuperer Arguments sur la ligne de commande ?
    Par Muetdhiver dans le forum x86 16-bits
    Réponses: 9
    Dernier message: 20/01/2003, 21h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo