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][REGEX] erreur dans fonction


Sujet :

Langage Perl

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut [DEBUTANT][REGEX] erreur dans fonction
    Bonjour,

    Je viens d'écrire une sous routine mais elle ne passe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    sub check_line {
            if(!($_[0]~=$_[1])) {
                    print "error : ".$_[0];
                    exit 1;
            }
    }
    Mon but serait de passer en premier argument la ligne a verifier et dans le second mon (ma?) regex. Ecrit directement cela fonctionne mais pas ici (perl n'aime pas cet operateur sur des variables? ), existe il un moyen ?

    D'avance merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    Etourderie... =~ Je comprenais pas.

    Cependant mon test se revele toujours etre faux. C'est à dire que je sors toujours de mon programme et je ne comprends pas d'avantage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $/ = "\n";
    my $line = <STDIN>;
     
    sub check_line {
            if(!($_[0]=~$_[1])) {
                    print "error : [".$_[0]."]"."\n";
                    exit 1;
            }
    }
    while(1) {
            check_line($line,"m{^\d{1,2}\n$}");
    }
    Que je rentre 1 ou a dans mon terminal, j'ai error...

  3. #3
    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
    Citation Envoyé par TabrisLeFol
    Etourderie... =~ Je comprenais pas.

    Cependant mon test se revele toujours etre faux. C'est à dire que je sors toujours de mon programme et je ne comprends pas d'avantage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $/ = "\n";
    my $line = <STDIN>;
     
    sub check_line {
            if(!($_[0]=~$_[1])) {
                    print "error : [".$_[0]."]"."\n";
                    exit 1;
            }
    }
    while(1) {
            check_line($line,"m{^\d{1,2}\n$}");
    }
    Que je rentre 1 ou a dans mon terminal, j'ai error...
    C'est probablement parce que tu n'as pas de lignes commençant pas "m{" dans ton fichier...

    Le m{ } fait partie du code, pas de la regex, un script correct serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    local $/ = "\n";
     
    sub check_line {
        my( $string, $regex ) = @_;
            if( $string !~ m{$regex} ) {
                    print "error : [$string]\n";
                    exit 1;
            }
    }
     
    while(1) {
      my $line = <STDIN>;
      check_line($line, '^\d{1,2}\n$');
    }
    (note l'emploi de simple quotes plutôt que de double quotes autour du texte dont on va faire une regex, c'est important pour éviter que les caractères spéciaux soient interprétés trop tôt).

    Mais je te conseille plutôt d'envoyer des regexs compilés avec qr(), c'est plus propre et ça évite d'avoir à se poser des questions d'interpolation précoce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    local $/ = "\n";
     
    sub check_line {
        my( $string, $regex ) = @_;
            if( $string !~ m{$regex} ) {
                    print "error : [$string]\n";
                    exit 1;
            }
    }
     
    while(1) {
      my $line = <STDIN>;
      check_line($line, qr{^\d{1,2}$});
    }
    (le \n à la fin de la regex n'est pas nécessaire, $ va le matcher automatiquement)

    --
    Jedaï

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 760
    Points : 626
    Points
    626
    Par défaut
    ok , merci. Cela fonctionne mieux.
    Et en plus j'ai appris des choses?

    Par contre pour le qr, c'est juste quand on utilise des strings pour passer les regex, non ?
    m{qr{^\d{1,2}$}} n'a pas de sens.

    NB : J'ai essayé de lire une doc au sujet de qr, mais pour l'instant je trouve cela compliqué. (L'explication, pas l'usage.)

    EDIT : Et j'ai un nouveau problème : Comment faire pour recuperer les variables $1, $2 ... Car si j'ai bien compris, elles ont initialisées au niveau de ma fonction et donc invisible apres l'appel de cette fonction...

    RE-EDIT : problème résolu, on ecrivant autrement ma fonction. (Le test se fait maintenant avant l'appel. )

  5. #5
    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
    Citation Envoyé par TabrisLeFol
    m{qr{^\d{1,2}$}} n'a pas de sens.
    Non, effectivement, mais qr{ }ne construit pas une chaîne de caractère, il construit une regex déjà compilé. m/$rx/ utilise directement cette regex compilée sans la recompiler si $rx contient une regex, alors qu'elle l'interpole simplement si $rx contient une string.

    --
    Jedaï

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

Discussions similaires

  1. Erreur dans fonction !
    Par cincap dans le forum Débuter
    Réponses: 5
    Dernier message: 08/09/2013, 14h11
  2. Catcher erreur dans fonction + AWK
    Par Moostiq dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 19/09/2011, 11h57
  3. Erreur dans fonction
    Par worldhugo dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 29/06/2009, 11h29
  4. Erreur dans fonction FileTimeToLocalFileTime
    Par timotep dans le forum Windows Forms
    Réponses: 1
    Dernier message: 22/11/2007, 11h18
  5. [Debutant]Une erreur dans une fonction
    Par pierrot10 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 20/10/2006, 11h55

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