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 :

Caractère "=" dans une RegExp


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Par défaut Caractère "=" dans une RegExp
    Bonjour,

    Dans un code en Perl, je réalise un traitement sur des requêtes SQL.

    Un exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select col2 from table1 where col1 like '$1'
    $1 est juste une variable, qu'on va venir remplacer grâce au traitement réalisé dans la RegExp.

    Ma RegExp se présente ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            my $sep = "\$";
            my $request = shift;#je récupère ici la requête dont je parle au-dessus
     
            while ($request =~ /$sep/) {
                    if ($request =~ /(.*)$sep(\d+)(.*)/){
     
                            print "$1";#select col2 from table1 where col1 like '
                            print "$3";#'
     
                            my $value = traitement($2);
                            $request = $1.$value.$3;
                     }
           }
    Tout se passe bien pour ce traitement.

    MAIS, si je transforme la requête avec "=" au lieu de "LIKE", ça ne marche plus.

    Pouvez-vous me donner un coup de pouce, pour que ma RegExp marche à coup sûr dans les 2 cas ("=" et "LIKE")?

    Merci pour votre aide.

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ($request =~ /$sep/) {
    et non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while (request =~ /$sep/) {
    Tu peux rajouter ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $request = shift;#je récupère ici la requête dont je parle au-dessus
    $request = quotemeta($request);

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Par défaut
    Pour le dollar devant "request", c'est une faute de frappe lors du copié collé. J'avais pas fait attention.

    Et pour le quotemeta, je l'ai effectivement utilisé, mais je crois bien que ça mettait des antislash devant les espaces, et que ça ne tournait pas rond ensuite dans la RegExp.

    Je n'ai pas mon code avec moi, je vais profiter du WE, et je tiens au courant du débogage lundi matin depuis le taf.

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Bonjour,

    Voici mes remarques :
    • le quotemeta n'est pas indispensable, puisqu'il est surtout utile lorsqu'on utilise une chaine de caractère comme motif. Or là, il s'agit de la chaine à analyser.
    • l'usage d'une variable scalaire pour mettre le séparateur $ ne se justifie pas à mes yeux, et par ailleurs, avec les essais que j'ai réalisés sur une version 5.10, le résultat est incorrect : le $ n'est pas matché. Pour être correctement écrit, il faudrait :
      • soit insérer \$ directement dans la regexp
      • soit définir $sep ainsi : $sep = qr/\$/
    • la transformation d'un élément de motif peut être réalisée directement dans l'expression régulière, à l'aide du modificateur /e (pour execute).

    Voici le code proposé (testé avec like et =) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            my $sep = qr/\$/;
            my $request = shift;#je récupère ici la requête dont je parle au-dessus
     
            while ($request =~ /$sep/) {
                    $request =~ s/$sep(\d+)/traitement($1)/e;
           }

  5. #5
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Par défaut
    Pour djibril :

    J'ai essayé de passer ma requête dans le quotemeta avant le traitement dans la RegExp.

    Ca me donne l'expression suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select\ col2\ from\ table1_bwinf9601\ where\ col1\ like\ \'\$1\'
    Apparemment, je ne rentre même pas dans le IF.

    Philou, je vais essayer de prospecter dans la solution que tu proposes.

    Merci à vous deux, je donne des infos de mon avancement.

  6. #6
    Membre confirmé
    Inscrit en
    Avril 2007
    Messages
    161
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 161
    Par défaut
    Alors concernant le séparateur utilisé "$", j'ai pris ce caractère en exemple, mais ce peut être n'importe quoi.

    Donc je laisse l'utilisateur le choisir, et je le passe dans un quotemeta, tout seul, avant de balancer la requête dans le traitement de la RegExp.

    Philou, j'ai repris ton idée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    sub traitementRequest {
     
            my $request = shift;
            print "$request\n";#select col2 from table1 where col1 like '$1'
            my $sep = qr/\$/;
     
            while ($request =~ /$sep/) {
                     $request =~ s/$sep(\d+)/traitement($1)/e;
            }
     
            printError("traitementRequest","request : <$request>");
     
    }
    Ca marche très bien lorsque ma requête est en "LIKE", mais toujours pas quand j'utilise un "=" ...

    Je suis perplexe, j'ai vérifié ma récupération de la requête, tout à l'air correct.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Mmmm bizarre, avec mes essais, ça fonctionne.

    Peux-tu poster ici le résultat sur la console de cette expression perl insérée dans le while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print STDOUT "[$request]\n";
    Pour ton séparateur entré au clavier, il faut effectivement le traiter avec quotemeta, mais également avec chomp pour supprimé la fin de ligne.

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

Discussions similaires

  1. [RegExp] Repérer le caractère '\' dans une RegExp
    Par Dark_TeToN dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/02/2011, 17h06
  2. Réponses: 2
    Dernier message: 13/05/2009, 10h11
  3. [C#] insertion de caractère en exposant dans une string
    Par papouAlain dans le forum Windows Forms
    Réponses: 9
    Dernier message: 11/07/2006, 15h45
  4. pb:inserer des caractère en arabe dans une bd sql server
    Par l_faiza dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 24/12/2005, 14h02
  5. caractère spéciaux à mettre dans une variable
    Par BernardT dans le forum Langage
    Réponses: 7
    Dernier message: 12/12/2005, 11h24

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