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 :

découpage d'une ligne avec split


Sujet :

Langage Perl

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut découpage d'une ligne avec split
    Bonjour à tous,

    Je dois manipuler la ligne suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (X=1 ALORS A SEP OR Y=1 ALORS B) SEP AND U<=Z<=V ALORS W
    En fait, je veux découper la ligne en dessus selon "SEP" qui se trouve en dehors des parenthèses pour avoir en résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (X=1 ALORS A SEP OR Y=1 ALORS B)
    et
    Avec la ligne de code suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @Table = split(/SEP/, $ligne_code);
    ,
    le séparateur "SEP" qui se trouve entre les parenthèses est pris en considération.

    Est ce qu'il ya une solution pour ignorer le séparateur "SEP" qui se trouve entre les 2 parenthèses ?

    Merci BCP 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
    Si ton besoin se limite à cela, on peut arranger quelque chose, mais si tu as l'intention de traiter ce fichier plus avant, je te conseille vraiment de chercher une vraie solution à base de parser. De quel langage s'agit-il ?

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci pour la réponse Jedai,

    Je dois convertir la ligne de code en langage C.
    Comment je pourrais avoir une solution à base de parser ?

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Un autre chemin peut résoudre mon problème :

    Je voulais changer le nom du séparateur "SEP" qui se trouve entre les parenthèses par "SEP2" :

    (X=1 ALORS A SEP OR Y=1 ALORS B) SEP AND U<=Z<=V ALORS W

    J'ai utilisé l'expression régulière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $Line_code =~ s/SEP/SEP2/g;
    Mais cette expression prend en considération tous les séparateurs "SEP".
    Comment faire pour ne traiter que "SEP" qui se trouve entre les parenthèses.

  5. #5
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    C'est faisable avec une regex pour ce cas particulier, mais c'est pratiquement infaisable avec des regex pour un cas général. Il faut vraiment un parser.

    Soit tu écris toi même un parser minimum pour ta syntaxe, soit tu utilises un parser générique comme celui-ci de Damian Conway, mais ça demande un peu de temps d'apprentissage.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci Lolo78 pour ta réponse,

    Comment je peux le faire avec une regex pour ce cas particulier ?

    Merci BCP d'avance

  7. #7
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Si ta ligne se trouve dans la variable $line, tu peux par exemple faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $line =~ s/(\(.+)SEP(.+\))/$1SEP2$2/g;
    La ligne contient maintenant: "(X=1 ALORS A SEP2 OR Y=1 ALORS B) SEP AND U<=Z<=V ALORS W".

    La regex ne fait la substitution SEP en SEP2 que s'il y a une parenthèse ouvrante avant et une parenthèse fermante après.

    Exemple sous le debugger Perl:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      DB<1>  $line = "(X=1 ALORS A SEP OR Y=1 ALORS B) SEP AND U<=Z<=V ALORS W";
     
      DB<2> $line =~ s/(\(.+)SEP(.+\))/$1SEP2$2/g;
     
      DB<3> p $line
    (X=1 ALORS A SEP2 OR Y=1 ALORS B) SEP AND U<=Z<=V ALORS W
      DB<4>
    Mais ce n'est pas généralisable à des lignes ayant une structure syntaxique différente. C'est pour cela que les regex ne sont guère adaptées et qu'il faut passer par un parser.

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2014
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2014
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci Lolo78 pour tes réponses,

    Je vais essayer d'utiliser un parser pour ma syntaxe.

Discussions similaires

  1. Réponses: 3
    Dernier message: 05/09/2008, 10h32
  2. [DEBUTANT]comparaison une ligne avec un STRing
    Par Battosaiii dans le forum Langage
    Réponses: 2
    Dernier message: 05/05/2005, 20h15
  3. Extraire une valeur d'une ligne avec sed
    Par jojolepabo dans le forum Linux
    Réponses: 6
    Dernier message: 27/10/2004, 09h34
  4. [FP]Tracer Une ligne avec Dev-pascal
    Par yffick dans le forum Turbo Pascal
    Réponses: 9
    Dernier message: 17/12/2003, 16h33
  5. supprimer une ligne avec cle etrangere
    Par BaBas dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/07/2003, 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