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 :

Expression régulière perl


Sujet :

Langage Perl

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut Expression régulière perl
    Bonjour à tous,
    j'ai un fichier tabulé avec un nombre de colonne qui est variable selon la ligne.
    Mais, je cherche en fait à récupérer l'information contenue dans la premiere colonne, qui me servira par la suite de clé pour un hash, et stocker comme valeur pour cette clé, toutes les info contenues dans les colonnes suivantes.
    Voici comme se compose mon fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FBtr0070000	Nep3-RA	CG9565-RA
    FBtr0070002	CG9570-RA	
    FBtr0070003	Or19b-RA	CG32825-RA
    FBtr0070025	AnnX-RA	CG9579-RA
    FBtr0070025	AnxB10-RA	AnnX-RA CG9579-RA
    Je veux un hash {clé}->{valeurs} comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FBtr0070000 -> Nep3-RA,CG9565-RA
    FBtr0070002 -> CG9570-RA
    FBtr0070003 -> Or19b-RA,CG32825-RA 
    FBtr0070025 -> AnnX-RA,CG9579-RA,AnxB10-RA
    J'ai commencé en faisant comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while(<$data>){
            chomp;
            if ($_ =~ /(.*)\t((.*[\t])+)/){
    				my $cle = $1;
    				my $valeur = $2;
    				print "$valeur\n";
            }
    }
    Ca ne fonctionne pas ...
    Ca me retourne seulement le premier élément après ma première colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Nep3-RA	
    CG9570-RA	
    Or19b-RA	
    AnnX-RA
    AnxB10-RA
    Une idée ?

  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
    split me semble mieux indiqué non ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my ($id, @reste) = split /\t/;
    print "$id donne : ",join(",",@reste),"\n";
    Nous les geeks, c'est pas qu'on a une case en moins, c'est juste qu'on compte à partir de zéro.
    Plus les choses changent, plus elles restent les mêmes

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    Oui super !
    Merci !

  4. #4
    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
    Utiliser split est une bien meilleure solution.

    Mais pour info, ton expression régulière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if ($_ =~ /(.*)\t((.*[\t])+)/){
    ne fonctionne pas correctement très probablement à cause de '(.*)', une construction qu'il ne faut presque jamais utiliser car elle est dangereuse.

    Il faut soit construire une classe de caractères comprenant tout sauf la tabulation:
    soit utiliser un quantificateur non gourmand:

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

Discussions similaires

  1. [Perl]Expression régulière .
    Par Premium dans le forum Langage
    Réponses: 1
    Dernier message: 06/07/2009, 15h43
  2. Expressions régulières en perl
    Par flo_k dans le forum Langage
    Réponses: 2
    Dernier message: 06/11/2007, 19h54
  3. Réponses: 6
    Dernier message: 30/05/2007, 17h31
  4. [Noob] Formation rapide à Perl - Expressions régulières
    Par Konrad Florczak dans le forum Langage
    Réponses: 16
    Dernier message: 25/09/2006, 14h48
  5. Expression Régulière PERL
    Par slyv dans le forum Langage
    Réponses: 8
    Dernier message: 25/10/2005, 20h30

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