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 :

problème expression régulière


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 29
    Points
    29
    Par défaut problème expression régulière
    Bonjour, je bloque sur un problème tout con.
    J'ai un fichier res.txt qui comporte une seule ligne :
    parametre : 3

    J'essaye de récupérer la valeur de mon paramètre via une regex mais je n'y arrive pas.
    La valeur du paramètre est un entier mais il peut y avoir plusieurs espaces entre le : et l'entier.
    Voilà mon fichier perl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /usr/bin/perl
    open(RESULT,"res.txt");
     
    while (my $line = <RESULT>) {
    	print $line;
    	$param = $1 if $line =~ /^parametre :\s+(\d+)$/;
    }
    	print "mon parametre : $param\n";
     
    close RESULT;
    Où se situe ma bétise?

  2. #2
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par lovelace63 Voir le message
    Bonjour, je bloque sur un problème tout con.
    J'ai un fichier res.txt qui comporte une seule ligne :
    parametre : 3

    J'essaye de récupérer la valeur de mon paramètre via une regex mais je n'y arrive pas.
    La valeur du paramètre est un entier mais il peut y avoir plusieurs espaces entre le : et l'entier.
    Voilà mon fichier perl :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /usr/bin/perl
    open(RESULT,"res.txt");
     
    while (my $line = <RESULT>) {
    	print $line;
    	$param = $1 if $line =~ /^parametre :\s+(\d+)$/;
    }
    	print "mon parametre : $param\n";
     
    close RESULT;
    Où se situe ma bétise?
    peux-tu attacher ton fichier res.txt ?

    Es-tu certain qu'il y a bien un espace entre : et le nombre ?
    C'est peut-être un problème d'ancrage à $ :
    • Es-tu certain qu'il n'y a pas d'espace après le nombre ?
    • Est-ce que le fichier est produit sous windows et lu sous unix/linux ?


    une autre manière simple et robuste de lire ce paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    open(RESULT,"res.txt");
    my $fulltext = do { local $/; <RESULT> };
    my ($param) = $fulltext =~ m/parametre\s*:\s*(\d+)/ms;
    print "mon paramètre : $param\n";
    close(RESULT);
    si tu as plusieurs paramètres à lire, tu peux ajouter des lignes analogues à la ligne 3.

    Tu peux également jeter un oeil aux différents packages de lecture de fichiers de config sur CPAN, par exemple Config::General
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    essaie voir avec la modif en rouge car je pense que tu dois avoir des caractères en fin de ligne
    si ça ne fonctionne pas essaie de ne pas mettre dans l'expression régulière le "^" ni le "$"
    Citation Envoyé par lovelace63 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /usr/bin/perl
    open(RESULT,"res.txt");
    		
    while (my $line = <RESULT>) {
    	$line=~/[\r\n]+$/;
    	print $line;
    	$param = $1 if $line =~ /^parametre\s*:\s*(\d+)$/;
    }
    	print "mon parametre : $param\n";
    
    close RESULT;

  4. #4
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par 6ril23 Voir le message
    essaie voir avec la modif en rouge car je pense que tu dois avoir des caractères en fin de ligne
    si ça ne fonctionne pas essaie de ne pas mettre dans l'expression régulière le "^" ni le "$"
    je pense que tu voulais écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #! /usr/bin/perl
    open(RESULT,"res.txt");
    		
    while (my $line = <RESULT>) {
    	print $line;
    	$line =~ s/[\r\n]+$//;
    	$param = $1 if $line =~ /^parametre\s*:\s*(\d+)$/;
    }
    	print "mon parametre : $param\n";
    
    close RESULT;
    (et c'est mieux dans ce cas de le mettre après le print qu'avant...)
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par cmcmc Voir le message
    je pense que tu voulais écrire
    oui effectivement j'ai été trop vite
    Citation Envoyé par cmcmc Voir le message
    (et c'est mieux dans ce cas de le mettre après le print qu'avant...)
    heu non je préfère mettre le print après:

  6. #6
    Membre confirmé
    Avatar de cmcmc
    Homme Profil pro
    Inscrit en
    Juillet 2013
    Messages
    316
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juillet 2013
    Messages : 316
    Points : 641
    Points
    641
    Par défaut
    Citation Envoyé par 6ril23 Voir le message
    oui effectivement j'ai été trop vite

    heu non je préfère mettre le print après:
    ... en rajoutant le \n , certes, mais si tu ne touches pas au print ...
    Sauf indication contraire tous les codes que je présente sont utilisables et testés (mais sans garantie d'aucune sorte)
    J'apporte beaucoup de soin à la rédaction de mes posts et apprécie les retours donc merci de s'il vous paraissent pertinents ou utiles
    Lazyness, Impatience and Hubris are good for you

  7. #7
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 29
    Points
    29
    Par défaut
    si ça ne fonctionne pas essaie de ne pas mettre dans l'expression régulière le "^" ni le "$"
    Bien joué, le problème venait du $.

    Merci beaucoup

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    ben si tu ne touches pas au print, je trouve qu'il n'a aucun intérêt
    je conseillerais de toujours borner les print afin de ne pas passer à côté des caractères "invisibles" éventuels (souvent en fin de lignes)

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    Citation Envoyé par lovelace63 Voir le message
    Bien joué, le problème venait du $.

    Merci beaucoup
    je pense que si ça venait du $, "$line =~ s/[\r\n]+$//;" doit le résoudre
    mais je te conseille d'essayer de trouver pourquoi et ainsi tu pourras remettre le $

  10. #10
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mars 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2008
    Messages : 36
    Points : 29
    Points
    29
    Par défaut
    je pense que si ça venait du $, "$line =~ s/[\r\n]+$//;" doit le résoudre
    Cela n'a pas l'air de fonctionner comme cela.

    Les fichiers sont générés via du fortran (et ce n'est pas moi qui contrôle la génération). Peut être qu'il y a un truc bizarre en fin de ligne mais vi ne voit rien. Pourtant j'avais mis un chomp au début au cas où mais il ne fonctionnait pas non plus.

    Cette solution fonctionne parfaitement du coup je ne me plonge pas plus dedans.

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2013
    Messages
    247
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2013
    Messages : 247
    Points : 406
    Points
    406
    Par défaut
    essaie de modifier ton print en : print ">$line<\n";

    sinon tu peux essayer de faire "$line =~ s/\s*$//;" car normalement tu vas enlever tous les caractères "invisibles": \r, \t, \n, \0, \v, espace...

    attention: pour \v (tabulation verticale) ça ne fonctionne qu'à partir 5.10.2 (je crois); avant ça enlève la lettre v...

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

Discussions similaires

  1. Problème expressions régulières
    Par cottcott dans le forum Langage
    Réponses: 7
    Dernier message: 09/05/2007, 14h29
  2. Réponses: 3
    Dernier message: 20/04/2007, 14h47
  3. Problème expression régulières
    Par LEK dans le forum C#
    Réponses: 2
    Dernier message: 18/04/2007, 11h40
  4. [RegEx] problème expression régulière
    Par H-bil dans le forum Langage
    Réponses: 4
    Dernier message: 13/02/2007, 15h38
  5. Problème expressions régulières
    Par sozie9372 dans le forum Langage
    Réponses: 3
    Dernier message: 07/06/2006, 15h13

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