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 :

Tester si une variable contient une regex valide


Sujet :

Langage Perl

  1. #1
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut Tester si une variable contient une regex valide
    Bonsoir.

    Comment peut-on tester si une variable contient une expression régulière bien formée (c'est à dire ne produisant pas d'erreur à l'évaluation) ?

    Je passe une regex en argument de ligne de commande. Tout marche bien mais je voudrais pouvoir gérer les erreurs moi-même quand l'expression n'est pas valide (éviter l'arrêt du script, afficher un message à moi...).

    Voilà le code (simplifié).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #!/usr/bin/perl -w
    use strict;
    die "Aaargs!!\n" if (! defined $ARGV[1]) ;
    my $path = shift;
    my $regex = shift;
     
    opendir DIR, $path    
        or die "Can't open $path : $!\n"; 
     
    my @filelist = map {$path . '/' . $_} 
                        grep { -f "$path/$_" && /$regex/} 
                            readdir DIR;
     
    #map {print "$_\n"} @filelist;
    Pour le test j'ai essayé des solutions du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ... if (!defined(eval('$regex =~ '."/$regex/")));
    ... if (!defined(eval("/$regex/")));
    mais j'obtiens systématiquement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in pattern match (m//) at (eval 1) line 1.
    D'où la question: comment évaluer la syntaxe d'une regex ?

    Merci d'avance.

  2. #2
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu devrais déjà tester si la regex est bien définie :
    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
    #!/usr/bin/perl -w
    use strict;
    die "Aaargs!!\n" if (! defined $ARGV[1]) ;
    my $path = shift;
    my $regex = shift;
    defined $regex
      or die usage();
     
    {
      no warnings;
      eval '$path =~ m/$regex/';
      if( $@ ) {
        die "Your regex doesn't seem valid : $@.";
      }
    }
     
    opendir DIR, $path    
        or die "Can't open $path : $!\n"; 
     
    my @filelist = map {$path . '/' . $_} 
                        grep { -f "$path/$_" && /$regex/} 
                            readdir DIR;
     
    sub usage {
      return <<EOU
    Usage : $0 path regex
    EOU
    }
    (NB : Si c'est pour un "petit" script jetable, je me contenterais de laisser Perl avertir l'utilisateur du fait que la regex a un problème, par contre je vérifierais bien qu'effectivement l'utilisateur a entré une regex)

    --
    Jedaï

  3. #3
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Merci, maître Jedaï. C'est exactement ce que je cherchais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    {
      no warnings;
      eval '$path =~ m/$regex/';
      if( $@ ) {
        die "Your regex doesn't seem valid : $@.";
      }
    }
    Toutefois, il semble que le test laisse passer des erreurs possibles (pardon, des avertsissements):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ img2pdf.test.0 . "\y"
    Unrecognized escape \y passed through in regex; marked by <-- HERE in m/\y <-- HERE / at img2pdf.test.0 line 25.
    Bien sûr si on n'utilise pas les warnings, alors pas de problème. Existe-il un moyen de contourner le problème ?
    Sinon, je passe en résolu.

    NB En fait, j'avais déjà testé que l'utilisateur a bien entré une regex (test sur @ARGV).

  4. #4
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Ce sont des warnings, pas de véritables erreurs, désactive les warnings localement si ça te gène (note bien que les warnings sont envoyés sur la sortie d'erreur et ne perturbe pas le déroulement du programme, je serais toi je les laisserais) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my @filelist = map {$path . '/' . $_} 
                        grep { no warnings; -f "$path/$_" && /$regex/} 
                            readdir DIR;
    --
    Jedaï

  5. #5
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Merci encore, très clair (comme toujours )

    PS En fait, après ton dernier post, j'avais pensé à mettre un no warnings dans le bloc grep mais mon compilateur n'aime pas trop ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i-blis:~/scripts ofya$ perl img2pdf.test.0 . "\y"
    Unrecognized escape \y passed through in regex; marked by <-- HERE in m/\y <-- HERE / at img2pdf.test.0 line 25.

  6. #6
    Expert éminent
    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
    Points : 8 586
    Points
    8 586
    Par défaut
    Tu ne m'as pas mis le bon message d'erreur. Le problème semble être que le bloc de grep n'est pas du point de vue de Perl un véritable bloc mais plutôt une pseudo-expression... Il faudra donc mettre le no warnings plus à l'extérieur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my @filelist = do {
      no warnings;
      map {$path . '/' . $_} 
        grep { -f "$path/$_" && /$regex/} 
         readdir DIR;
    };
    --
    Jedaï

  7. #7
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    Oups, pardon. Je donne le message d'erreur pour que tout le monde comprenne: le bloc de grep est bel et bien traité comme une (pseudo-)expression.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "no" not allowed in expression at img2pdf.test.0 line 27, at end of line BEGIN not safe after errors--compilation aborted at img2pdf.test.0 line 27.
    Pour y remédier j'avais mis le no warnings avant l'assignation de variable. Je ne connaissais pas l'écriture avec do, bien plus élégante.

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

Discussions similaires

  1. [Débutant] Affecter une variable d'une classe C# à une variable Javascript
    Par SultanGeek dans le forum C#
    Réponses: 0
    Dernier message: 20/06/2015, 21h42
  2. [RegEx] verifier via les regxp si une variable contient une autre variable
    Par moukit233 dans le forum Langage
    Réponses: 3
    Dernier message: 29/12/2009, 15h59
  3. faire passer une variable d'une fct js à une page php
    Par harlock59 dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 15h41
  4. Affecter une variable javascript à une variable php
    Par gwendy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 21h58
  5. Désigner une variable avec une variable?
    Par littleman dans le forum Paradox
    Réponses: 4
    Dernier message: 12/08/2002, 12h21

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