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 :

Compiler une regex


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de blacksnake
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Par défaut Compiler une regex
    Salut à vous,

    J'ai lu je ne sais plus où le terme compiler une regex. J'ai un vague souvenir qu'on l'utilise comme ceci, mais qqn pourrait donner un exemple concret ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $a = "aaa";
    $b = "bbb";
     
    @global =~ qr{s/$a/$b/}

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    heu peux tu préciser ce que tu souhaites faire

  3. #3
    Membre confirmé Avatar de blacksnake
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Par défaut
    En fait je souhaite comprendre ce que cela veut dire par le biais d'une démonstration.

  4. #4
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Pour commencer, ton exemple est absurde (soit dit sans vouloir être blessant) : on n'utilise pas qr comme ça. Ça marche, certes, et aussi bien qu'autre chose, mais ça ne sert à rien de mettre qr là. qr sert principalement à créer un objet regex, c'est à dire une variable contenant une regex. C'est très pratique pour tout un tas de choses, notemment pour composer des regex à partir d'autres regex, ou d'autres variables. C'est plus pratique que l'interpolation de variables dans pas mal de situations, et bien utilisé ça permet certaines optimisations. Je vais essayer de trouver de la doc en ligne, mais c'est pas simple. Je vais potasser mon Friedl à ce sujet pour trouver des exemples (ça ne me fera pas de mal, je ne suis pas sûr de me servir de qr autant que je pourrais).

    EDIT : en fait, ça ne marche même pas, ton exemple, au temps pour moi.

  5. #5
    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
    Ce qu'on peut compiler, c'est une regex, pas une substitution ou un match, une regex, autrement dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $regex = qr/hello/;
     
    while( <> ) {
      s/$regex/bye/;
      print;
    }
    remplace tous les "hello" par des "bye".
    A noter que cet exemple n'a absolument aucun intérêt puisque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while( <> ) {
      s/hello/bye/;
      print;
    }
    fait exactement la même chose ( "hello" étant une chaîne constante, la regex n'est compilée qu'une fois, puis réutilisée à chaque ligne).

    Dans le cas suivant compiler la regex a plus de sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $variable = <STDIN>;
     
    while( <> ) {
      s/$variable/bye/g;
      print;
    }
    En effet, perl (l'interpréteur) ne peut pas deviner que $variable ne changera pas d'une itération de la boucle à l'autre, la regex sera donc recompilée à chaque itération, avec une pénalité en temps d'exécution (probablement négligeable ici, mais pas dans tous les cas)...
    C'est une bonne idée d'utiliser alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $variable = <STDIN>;
    my $regex = qr/$variable/;
     
    while( <> ) {
      s/$regex/bye/g;
      print;
    }
    Dans ce cas la regex ne sera compilée qu'une seule fois.

    L'autre intérêt de qr// c'est de nommer des parties de regex, de façon à construire des regexs complexes de façon plus maintenable, ainsi que de faciliter le passage de regex en paramètre d'une fonction, ou en sortie d'une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my @days = qw/Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche/;
    my $rday = list2regex( @days );
    my @months = qw/.../;
    my $rmonth = list2regex( @months );
     
    # $1 : jour, $2 : jour du mois, $3 : mois, $4 : année
    my $rdate = qr{($rday) (\d+) ($rmonth) (\d+)};
     
    sub list2regex {
      my $temp = join '|', map {quotemeta} @_;
      return qr/(?:$temp)/;
    }
    --
    Jedaï

  6. #6
    Membre confirmé Avatar de blacksnake
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 64
    Par défaut
    Merci bcp, j'y vois plus clair maintenant.

    Ca doit être ce type d'info qui a du m'interloquer : "faciliter le passage de regex en paramètre d'une fonction"

  7. #7
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Citation Envoyé par Jedai
    Dans le cas suivant compiler la regex a plus de sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $variable = <STDIN>;
     
    while( <> ) {
      s/$variable/bye/g;
      print;
    }
    En effet, perl (l'interpréteur) ne peut pas deviner que $variable ne changera pas d'une itération de la boucle à l'autre, la regex sera donc recompilée à chaque itération, avec une pénalité en temps d'exécution (probablement négligeable ici, mais pas dans tous les cas)...
    C'est une bonne idée d'utiliser alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    my $variable = <STDIN>;
    my $regex = qr/$variable/;
     
    while( <> ) {
      s/$regex/bye/g;
      print;
    }
    Dans ce cas la regex ne sera compilée qu'une seule fois.
    Plus exactement, Perl vérifie si le contenu de la variable a changé avant de recompiler, donc il ne recompile pas à chaque fois. Mais en effet, le coût de cette vérification étant non nul, on y gagne.

    L'autre intérêt de qr// c'est de nommer des parties de regex, de façon à construire des regexs complexes de façon plus maintenable, ainsi que de faciliter le passage de regex en paramètre d'une fonction, ou en sortie d'une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    my @days = qw/Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche/;
    my $rday = list2regex( @days );
    my @months = qw/.../;
    my $rmonth = list2regex( @months );
     
    # $1 : jour, $2 : jour du mois, $3 : mois, $4 : année
    my $rdate = qr{($rday) (\d+) ($rmonth) (\d+)};
     
    sub list2regex {
      my $temp = join '|', map {quotemeta} @_;
      return qr/(?:$temp)/;
    }
    À noter en passant que, quand on crée un objet regex dans le but de l'envoyer à une fonction ou composer une regex plus complexe, il faut être très prudent avec les parenthèses capturante. Je pense que tout le monde sera d'accord pour dire que mettre des parenthèses capturantes dans un objet regex est, d'une façon générale, à éviter. À moins, bien sûr, d'avoir une raison très précise de le faire (de même qu'on peut hypothétiquement avoir une raison très précise de se planter un clou dans la rotule, par exemple).

Discussions similaires

  1. [RegEx] php et javascript dans une regex
    Par grochenel dans le forum Langage
    Réponses: 7
    Dernier message: 06/12/2005, 22h21
  2. [RegEx] spliter par rapport a une regex en récuperant la regex
    Par Khrysby dans le forum Langage
    Réponses: 1
    Dernier message: 10/11/2005, 15h08
  3. [VB] COmment compiler une dll dans un exe (zlib.dll)
    Par Khrysby dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 01/11/2005, 12h10
  4. [Applet] Compiler une applet ?
    Par Bobsinglar dans le forum Applets
    Réponses: 6
    Dernier message: 30/06/2005, 18h06
  5. [Debutant(e)]Compiler une classe
    Par tscoops dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 27/05/2004, 13h50

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