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 :

Variables et Expression Regulière


Sujet :

Langage Perl

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Variables et Expression Regulière
    Bonjour,

    Je cherche à remplacer des lignes d'un fichier texte.
    Je récupère mes motifs de recherche et de remplacement dun aun autre fichier texte, que je reformatte un peu, nottament pour précéder les caractères spéciaux par un backslash.
    Mon problème est que le texte ne sort pas comme je le souhaite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $regles{"REGLES"}{$idregle}{"CHANGEOLDBLOC"} = (.*) (.*?)\.QTTIT_T3(.*)
    $regles{"REGLES"}{$idregle}{"CHANGENEWBLOC"} = $1 ZZ9K\.ZZ9K_QTTIT$3
    ces deux variables font parties d'une table dehashage remplie par lecture d'un fichier et ne sont pas explicitement déclarée comme cela.

    lorsque j'utilise la fonction suivante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sortie[$i] =~ s/$regles{"REGLES"}{$idregle}{"CHANGEOLDBLOC"}/$regles{"REGLES"}{$idregle}{"CHANGENEWBLOC"}/gi;
    le résultat retrouné est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Source avant :
    IF W_TEST = 1 THEN
                PUT SKIP LIST('TR4:' !! PMTIT.QTTIT_T3);
             IF PMTIT.QTTIT_T3 ^> 0     /* OK Ag FITIT */
    THEN DO;
     
    Source après :
     
             IF W_TEST = 1 THEN
    $1 ZZ9K\.ZZ9K_QTTIT$3
    $1 ZZ9K\.ZZ9K_QTTIT$3
             THEN DO;

  2. #2
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Je pense que tu dois créer une chaine contenant la regexp et faire un eval dessus pour que les variables fonctionnent.

  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
    Tu dois faire un double eval je pense, ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    s/$regles{"REGLES"}{$idregle}{"CHANGEOLDBLOC"}/$regles{"REGLES"}{$idregle}{"CHANGENEWBLOC"}/eegi;

  4. #4
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    Le premier niveau d'eval est fait d'office par perl donc un seul "e" devrait suffire :-)

  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
    Le premier niveau d'eval est fait d'office par perl donc un seul "e" devrait suffire
    Non, Perl fait une interpolation en temps normal, si on mets un /e, l'interpolation est remplacée par une évaluation : on peut donc mettre n'importe quelle "expression" pour la partie remplacement, comme par exemple une fonction. Ici on a simplement une variable qui est donc évaluée, il faut évaluer son contenu pour que le remplacement se fasse, d'où le deuxième /e.

    --
    Jedaï

  6. #6
    vic
    vic est déconnecté
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2002
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 431
    Points : 498
    Points
    498
    Par défaut
    OK je ne savais pas que l'interpolation était remplacée par une évaluation .. ça parait assez logique quand on y réfléchit un peu

Discussions similaires

  1. Recherche recursive à l'aide des expressions reguliére
    Par titoff dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/12/2005, 16h42
  2. [RegEx] aide pour une expression regulière
    Par hugo123 dans le forum Langage
    Réponses: 5
    Dernier message: 24/11/2005, 15h41
  3. ET dans une expression regulière
    Par kesako dans le forum Langage
    Réponses: 4
    Dernier message: 10/11/2005, 12h57
  4. Problème expression regulière ??
    Par panaone dans le forum Langage
    Réponses: 5
    Dernier message: 18/08/2005, 13h41
  5. Réponses: 2
    Dernier message: 04/01/2004, 15h14

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