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

Programmation et administration système Perl Discussion :

Fonction eval et crochet


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut Fonction eval et crochet
    Bonjour,

    Pourrait on m'expliquer les lignes qui contiennent les fonctions eval et les ligne avec les $ crochets, $ virgule et $ antislah :
    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
    eval 'exec perl -S $0 "$@"'
        if $running_under_some_shell;
    # this emulates #! processing on NIH machines.
    # (remove #! line above if indigestible)
     
    eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
     
    # process any FOO=bar switches
     
    $[ = 1;			# set array base to 1
    $, = ' ';		# set output field separator
    $\ = "\n";		# set output record separator
     
    $FALSE = 0;
    $TRUE = 1;

    D'avance merci .....

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    J'ai un petit peut avancer ...

    En effet, j'essaie de faire un test sur $ARGV[0], j'ai donc modifié les lignes comme suit :
    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
    eval 'exec perl -S $0 "$@"'
        if $running_under_some_shell;
    # this emulates #! processing on NIH machines.
    # (remove #! line above if indigestible)
     if ($ARGV[0] eq "") {
            print " syntaxe : perl numerote.pl nom_de_fichier \n" ;
            exit(-1) ;
       } 
    eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
     
    # process any FOO=bar switches
     
    $[ = 1;			# set array base to 1
    $, = ' ';		# set output field separator
    $\ = "\n";		# set output record separator
     
    $FALSE = 0;
    $TRUE = 1;
    Si je lance mon script sans argument, j'ai l'erreur suivante :
    Use of assignment to $[ is deprecated at ./flexCount.pl line 44

  3. #3
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Citation Envoyé par dubis
    Si je lance mon script sans argument, j'ai l'erreur suivante :
    Use of assignment to $[ is deprecated at ./flexCount.pl line 44
    Cette variable spéciale n'est plus utilisée dans les versions récentes de Perl. Cela met le premier indice d'un tableau à 1 et aussi dans les extraction de sous-chaînes.
    Comme dit dans le lien donné, ce n'est pas recommandé de l'utiliser.

    Si vraiment cela est indispensable, la solution donnée ici pourrait fonctionner, à savoir l'utilisation de local.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Beniou,

    En fait le script sur lequel je travaille était réparti en 2 fichiers : un shell et un perl. J'essaie de n'avoir qu'une seule fichier perl.

    Pour revenir à mon problème, j'ai donc commenté les ligne suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     eval 'exec perl -S $0 "$@"'
         if $running_under_some_shell;
    eval '$'.$1.'$2;' while $ARGV[0] =~ /^([A-Za-z_0-9]+=)(.*)/ && shift;
    Le fonctionnement du script n'a pas changé.

    Et pour ces dernières
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    # process any FOO=bar switches
    $[ = 1;			# set array base to 1
    $, = ' ';		# set output field separator
    $\ = "\n";		# set output record separator

    J'ai des message d'erreur du style : Use of uninitialized value $feat in substitution. Ces 3 lignes me sont donc indispensable même si je ne les maîtrise pas

    Mon soucis est que j'aimerais introduire le test de SYNTAXE sur ARGV[0] qui est toujours sans effet.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if ($ARGV[0] ne "") {
    	  $LIC_LOG_FILE=  $ARGV[0];
    	  }else {
    	print " syntaxe : flexCount.pl nom_de_fichier \n" ;
            exit 1 ;
       }
    Par contre le test sur ARGV[1] fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (defined($ARGV[1])) {
        print colored ['red on_black'], 'This script can not load one more file', "\n"; 
        exit 1 ;
    }

  5. #5
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Bonjour,

    Si tu veux obliger ton script à avoir un et un seul argument tu peux faire directement le test sur la longueur du tableau @ARGV.

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(@ARGV != 1){
        die "syntaxe : flexCount.pl nom_de_fichier\n\n";
    }
     
    my ($file) = @ARGV;
     
    ...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Beniou,

    J'ai donc modifié avec les lignes que tu m'as donné....

    Si je lance mon script hors de sa syntaxe c'est à dire simplement avec cette ligne de commande :
    J'ai l'erreur suivante :

    Use of assignment to $[ is deprecated at ./flexCount.pl line 52.

    Voici les lignes 52 à 54:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # process any FOO=bar switches don't erase or comment
    $[ = 1;			# set array base to 1
    $, = ' ';		# set output field separator
    $\ = "\n";		# set output record separator
    Je ne comprend pas ces variables car elle ne sont pas réutilisée dans la suite de mon script.
    Sont-elles des variables par défaut comme @ARGV ??

    Merci

  7. #7
    Membre confirmé Avatar de Beniou
    Homme Profil pro
    Inscrit en
    Novembre 2009
    Messages
    357
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Novembre 2009
    Messages : 357
    Points : 515
    Points
    515
    Par défaut
    Citation Envoyé par dubis
    J'ai l'erreur suivante :

    Use of assignment to $[ is deprecated at ./flexCount.pl line 52.
    Ce n'est pas à proprement parler une erreur mais plutôt un "warning" te disant que tu utilises une variable spéciale qui ne doit plus être utilisée (cf les liens de mon premier post).

    Pour faire simple :
    $[ = 1 : fait que tu accèderas à la première case de ton tableau avec l'indice 1 et non 0 comme par d"faut (enfin l'indice 0 fonctionnera toujours...).
    $, = ' ' : fait que l'espace servira pour séparer tes champs quand tu fais un print
    $\ = "\n" : fait que le saut de ligne sera mis à la fin de chacun de tes printsde façon implicite.
    Du coup cela est normal que ces variables ne semblent pas être utilisées après. Le plus dangereux est la première ($[ = 1) car ensuite tu peux te tromper d'indice lorsque tu accèdes à des éléments de ton tableau.

    A toi de voir si tu préfères enlever cette déclaration mais il faudra regarder dans le code s'il n'y a pas des accès à des valeurs du tableau en spécifiant l'indice (dans une boucle "for" par exemple). Pour les autres c'est juste de la visualisation.

    Enfin, le bout de code que je t'ai passé qui regarde le nombre d'arguments doit être au tout début de ton script avant les lignes avec $[ $, et $\. Car ce n'est pas parce que tu as lancé ton script sans argument que tu as ce warning...

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Beniou,

    Je vais donc garder la ligne principal maintenant que j'ai complètement compris

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

Discussions similaires

  1. Fonction eval en java ?
    Par ramislebob dans le forum Langage
    Réponses: 2
    Dernier message: 12/01/2006, 00h22
  2. Parsage avec la fonction eval
    Par alain31tl dans le forum Langage
    Réponses: 12
    Dernier message: 23/11/2005, 15h27
  3. Simuler la fonction eval
    Par topwl dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 26/08/2005, 01h44
  4. Existe-t-il une fonction Eval() sous Delphi ?
    Par Hell dans le forum Langage
    Réponses: 5
    Dernier message: 20/12/2004, 17h45
  5. [String] équivalent de la fonction eval() en javascript
    Par jeyce dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 01/09/2004, 08h42

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