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 :

Expressions régulieres et nombres d'occurences.


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut Expressions régulieres et nombres d'occurences.
    Bonjour à tous

    Voila je débute en perl et je ne suis pas encore tres à l'aise avec les ER essentiellement.

    Dans l'immediat j'ai besoin de compter le nombre d'occurences d'une chaine 'ou=' et en fonction d'écrire l'enregistrement auquel appartient cette premiere ligne dans plusieurs fichiers differents (une sorte de tri disons).
    J'ai donc écris la ligne suivante :

    if ($line =~ /ou={3}/)
    {
    print FILE $line;
    }


    Je pensais donc que cet ER renverrai TRUE si on trouve exactement 3 'ou=' dans la chaine $line, mais je n'ai pas obtenu le résultat escompté. Dans ddd j'ai d'ailleurs pu constaté que cette condition n'est jamais vraie mais que la condition $line =~ /ou={1}/ est par contre toujours vraie quelque soit mon nombre d'occurence (compris entre 1 et 3). J'ai également essayé avec un compteur de remplacement d'occurences $line += s/ou=/ou=/ sans grand résultat non plus.

    Je pense que sa vient de L'ER mais je peut me tromper...

    Voila je pense que ce probleme est façile à resoudre, mais je dois bien avoué que malgré mes recherches sur le net et sur ce forum je seche quelque peu.

    Wulf'.

  2. #2
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    ton expression ou={3} recherche la chaîne ou===, ça ne compte pas les occurrences.

    pour savoir combien de fois tu retrouves ton pattern tu dois
    - matcher sur la globalité de ta chaîne en utilisant l'option g
    - récupérer la liste et compter le nombre de matchs !

    voici un petit exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    my $string = "re: as asm asdou=asdtrasou=r";
    my @list = $string =~ /ou=/g;
    my $nombre_d_occurrence = scalar @list;
    print "la chaîne ou= est retrouvée $nombre_d_occurrence fois";

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 17
    Points : 9
    Points
    9
    Par défaut
    Ok je vois la différence, j'avais pas compris l'ER {} comme ça en fait...

    Du coup avec ta manip' je comprend et ça marche beaucoup mieux. J'aurais finalement pas à trier mon fichier de 300 000 lignes à la mimine

    Merci beaucoup pour cette explication claire et concise,

    Wulf'.

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    pense à faire @list=(); par la suite car il utilisera de la memoire inutilement

  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
    Une petite astuce, pour éviter d'en passer par une liste intermédiaire inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $string = "re: as asm asdou=asdtrasou=r";
    my $nombre_d_occurrence =()= ($string =~ /ou=/g);
    print "la chaîne ou= est retrouvée $nombre_d_occurrence fois";
    En gros "() =" force la regexp en contexte de liste, donc elle renvoie théoriquement la liste que tu avais placé dans @list dans le code précédent, puis "$nombre_d_occurence =" force ce tableau en contexte scalaire, donc récupère le nombre d'éléments de la liste.
    En réalité, au moins dans les Perl récents, la liste ne sera jamais construite et on comptera directement le nombre de match, ce sera donc plus efficace.
    "=()=" est donc un pseudo-opérateur en Perl qui te permettra de compter le nombre d'éléments renvoyés par une fonction ou un match.

    --
    Jedaï

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

Discussions similaires

  1. Expression Régulier d'un nombre réel
    Par aymen8219 dans le forum Langages de programmation
    Réponses: 1
    Dernier message: 03/12/2011, 18h40
  2. [Debutant] Expression réguliere
    Par grizzz dans le forum Collection et Stream
    Réponses: 10
    Dernier message: 17/08/2007, 16h14
  3. expression réguliere en c++
    Par alambics dans le forum MFC
    Réponses: 9
    Dernier message: 10/03/2004, 20h19
  4. expression réguliere
    Par alambics dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/03/2004, 13h52
  5. recherche du nombre d'occurences dans une table
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/01/2004, 20h03

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