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 :

comparaison de deux hash de tableaux


Sujet :

Langage Perl

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut comparaison de deux hash de tableaux
    bonjour;
    desoler de vous de déranger encore mais j'ai un probleme avec cette boucle
    j'ai fait une petite exemple pour simplifier
    en faite j'ai deux hash de tableaux , j'essaie de tester si tous les élements d'un keys de mon tableau %hash se trouve tous dans une meme clé de mon %h et afficher avec quel keys voilà mon code actuellement mais y'a des erreurs dans la boucle que j'ai faite , je sais pas exatement en kel moment je déclare mon variable et en kel moment je récupere son contenu et en kel moment je remets le compteur à zéro , voilà mon code actuellement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %h;
    %h = (
         K1=> ["has","hsgz","hsgz"],
         K2=> ["dax","pip","pip","has",],
    	 K3=> ["dax","hsa"],
    	 K4=> ["dax"],
    	 K5=> ["pip","pip","mas","mna","maa"],
     
    	);
    my %hash;
    %hash = (
         clone1=> ["has","hsgz","hsgz"],
         clone2=> ["dax","mac" ],
    	 clone3=> ["max","pip","nana","has",],
    	 clone4=> ["dax","hsa"],
    	 clone5=> ["pip","pip","chu","mna","mna"],
     
    	);
    print "$#{$hash{clone1}} \n";
    my @liste ;
    @liste=("has","hsgz",);
    my @liste1=("has","hsgz",);
    my @liste2=("has","hsgz","hsgz");
    my @liste_controle;
    foreach my $x(@liste1){
       foreach my $y(@liste2){
         if ($x=~m/$y/){push (@liste_controle,1);}
     
       }
    }
    my $long_liste1=$#liste1+1;
    my $long_liste2=$#liste2+1; 
    if ($long_liste2>=$long_liste1){print "reussi\n";}
    else {print "non reussi\n";}
    #if ($#@liste1=$#liste2){print "vrai reussi\n";}
    #else {print "non reussi\n";}
    my @clone_clade;
    foreach my $f(keys(%hash)  ) {my $compteur_clone_clade=0;
     
       foreach my $x(@{$hash{$f}} ){
     
          foreach my $g(keys (%h) ){
    	    my $compteur_element_clade=0;
            my $compteurXvsY=0;
     
             foreach my $y(@{$h{$g} } ){
     
                 if ($x=~m/$y/){ $compteurXvsY=1 ; }else {$compteurXvsY=0 ;}
       }
     if($compteurXvsY==1)  {$compteur_element_clade=1;
                           $compteur_clone_clade+=$compteur_element_clade;}
     
     
     
     
    }
    my $p=$#{$hash{$f}}+1;
     if ($compteur_clone_clade==$p) {
     
     print "tous les especes de $f se trouve dans la meme clade   $compteur_clone_clade  $p          \n";}
     
     
     
     }
     
     }
     
     
    <>;
    merci d'avance bonne journée à tous

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Comment fais-tu la correspondance entre les clés de %h (Kn) et les clés de %hash (clonen) ?
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  3. #3
    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
    Bonjour,

    c'est la même question, me semble-t-il, que celle que tu poses ici: http://www.developpez.net/forums/d16...d-fichier-txt/

    Il vaut mieux éviter de poser la même questions à des endroits différents, ça tend à disperser les éventuelles réponses.

  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
    S'il s'agit de trouver les éléments du second hash non présents dans le premier, tu peux essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %h = (
         K1=> ["has","hsgz","hsgz"],
         K2=> ["dax","pip","pip","has",],
    	 K3=> ["dax","hsa"],
    	 K4=> ["dax"],
    	 K5=> ["pip","pip","mas","mna","maa"],
     	);
    my %hash = (
         clone1=> ["has","hsgz","hsgz"],
         clone2=> ["dax","mac" ],
    	 clone3=> ["max","pip","nana","has",],
    	 clone4=> ["dax","hsa"],
    	 clone5=> ["pip","pip","chu","mna","mna"],
    	);
     
    my %items = map { $_ => 1 } map { @$h{$_} } keys %h;
     
    # print Dumper \%items;
     
    for my $key (%hash) {
        push @missing, grep { not exists $items{$_} } @{$hash{$key}}
    }
    print "@missing\n";

    Ce qui donne:
    Si ton besoin est différent, explique de façon plus approfondie.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bsr ,
    non en faite je compare pas les clés mais je compare les élements de de chaque clé de mon premier tableaux avec les éléments qui se trouvent dans chaque clé de mon 2 eme tableau j'essaie d'avance mais les résultats qui me donnent sont encore erroné , ca détecte pas le premier élément

  6. #6
    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
    Oui, mais comme tes clefs ne sont pas les mêmes, tu ne peux pas comparer les deux hachages.

    Une solution consisterait à utiliser les éléments concaténés comme clefs d'un nouveau hachage, mais je n'ai pas le temps tout de suite, je reviendrai plus tard.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bsr;
    j'y suis presque arriver , c'est vraiment compliqué mais voilà le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    foreach my $z(keys %hash){
    my $compteurT=0; 
    my $compteurS;
    my $delta=0;
     
    foreach my $g(keys (%h) ){
    my @t;
    foreach my $x(@{$hash{$z} }  ){
     
     my $compteB =0;
     
     
     
     $compteurS=0;
     my  $B=0;
      foreach my $y(@{$h{$g}  }  ){if ($x eq $y){$B++;  }else {$B=0; } 
     
     
    #print "$B\t";
    if ($B>=1){$B=1;$compteB+=$B;  }
    elsif($B==0){$B=0;$compteB+=$B;}}
     
     
    if ($compteB>=1){$compteB=1;}
    #print "$z:$x:=>$g    $compteB     \n";
     
    push(@t, $compteB);
    $compteB+=$compteB;
     
    }
    my $somm;
    $somm=0;
    foreach (@t){$somm+=$_;}
     
    print "$z:$g:   $somm\n";
     
    }
     
     
     
    }
     
     
    print "fin\n";	
    <>;
    et voilà les résultat en capture écran Nom : Cap.PNG
Affichages : 336
Taille : 21,3 Ko
    j'ai pas encore fini parceque il faut que je compare le nombre de match avec la taille de keys clonne , si elles sont égaux c à d que tous les élements de la keys clone1 ont matché dans keys K1 par exp comme dans l'exemple clone1 et K1 tous les élements de clone un ont matché dans K1

    si ya des erreurs dans mon code merci de me le dire SVP
    bonne soirée à tous

  8. #8
    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
    Voici une solution possible:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    my %h = (
         K1=> ["has","hsgz","hsgz"],
         K2=> ["dax","pip","pip","has",],
         K3=> ["dax","hsa"],
         K4=> ["dax"],
         K5=> ["pip","pip","mas","mna","maa"],
         );
    my %hash = (
         clone1=> ["has","hsgz","hsgz"],
         clone2=> ["dax","mac" ],
         clone3=> ["max","pip","nana","has",],
         clone4=> ["dax","hsa"],
         clone5=> ["pip","pip","chu","mna","mna"],
        );
     
     
    my %items;
    for my $key (keys %h) {
        my @elements = sort @{$h{$key}};
        $items{"@elements"} = $key;
    }
     
    # print Dumper \%items;
     
    for my $key (keys %hash) {
        my @elements = sort @{$hash{$key}};
        if (exists $items{"@elements"}) {
            print "Eléments identiques: $key et ", $items{"@elements"}, ": @elements \n";
        } else {
            print "Eléments différents: $key, @elements\n";
        }
    }
    Ce qui affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Eléments différents: clone2, dax mac
    Eléments identiques: clone1 et K1: has hsgz hsgz
    Eléments identiques: clone4 et K3: dax hsa
    Eléments différents: clone5, chu mna mna pip pip
    Eléments différents: clone3, has max nana pip

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    un truc dans le code est que j'ai rendu tous les elements qui match plus qu'une fois dans la meme keys comme si il a matché pour une fois si pour ca j'ai met if ($compte>=1){$compteB =1}
    voilà le code final et les résultats de ce que je cherche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    foreach my $z(keys %hash){
    my $compteurT=0; 
    my $compteurS;
    my $delta=0;
     
    foreach my $g(keys (%h) ){
    my @t;
    foreach my $x(@{$hash{$z} }  ){
     
     my $compteB =0;
     
     
     
     $compteurS=0;
     my  $B=0;
      foreach my $y(@{$h{$g}  }  ){if ($x eq $y){$B++;  }else {$B=0; } 
     
     
    #print "$B\t";
    if ($B>=1){$B=1;$compteB+=$B;  }
    elsif($B==0){$B=0;$compteB+=$B;}}
     
     
    if ($compteB>=1){$compteB=1;}
    #print "$z:$x:=>$g    $compteB     \n";
     
    push(@t, $compteB);
    $compteB+=$compteB;
     
    }
    my $somm;
    $somm=0;
    foreach (@t){$somm+=$_;}
    my $taille_clone=$#{$hash{$z}}+1;
    if ($somm==$taille_clone){print"tous les especes de $z sont dans  $g\n";  }
     
    #print "$z:$g:  taille_clone:$taille_clone nombre de match:$somm\n";
     
    }
     
     
     
    }
     
     
    print "fin\n";	
    <>;
    Nom : neu.PNG
Affichages : 368
Taille : 27,9 Ko
    merci bcp;

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    en faite c'est pas ce qui'est demandé , parceque eux ils cherchent de savoir si les esepeces dont ADN a été séquencé ; est ce que ces especes appartiennent à un meme groupe taxonomique pour répondre au final à une question ?? la biodeversité de cet écosysteme ou pas de diversités parceque tous les especes qu'on a séquencé leurs ADN sont de la meme clade ,


    pour le code il me fallait créer une liste et stocker les matche de chaque clone puis de sommer les elements de la liste parceque j'ai pas trouvé de solution

    l'important est qu'on a découvert que c'est possible

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    mais encore un probleme avec un autre fichier , j'arrive pas à le lire comme il faut il me donne un message d'erreur le code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    open($metabolit ,'<','pathways');
    my @path;
    my $comte_xeno;
     
     
    while (my $line =<$metabolit>){chomp $line;push(@path,$line);}
    ####### PARTIE IV question 1 #######
    my $compte_path=0;
    my $compte_xeno=0;
      foreach (@path){
         if ($_=~m/(\[PATH:ko\d{5}\])/){$compte_path++;
    #	 print "$1\n";
    	 }
     
             }
          print "le nombre de voies metaboliques est :$compte_path\n";
    my %table;
    print "$metabolit\n";
     
    my $facto;
    foreach my $x(@path){
     
        if ($x=~m/(.*\[PATH:ko\d{5}\].*)/){$facto=$1;}
        else {push (@{$table{$facto}  },$x   );      } 
     
    }
     
    my @palm= keys (%table) ;
    #print "@palm\n";	  
    #print Dumper \%table;
    my $com=0;
    foreach my $x(keys %table){
         if ($x=~m/xenobiotics/i){$com++;}
    	 foreach my $y(@{$table{$x}  }   ){
    	   if ($y=~m/xenobiotics/i){$com++;}
     
    	 }
     
     
    }
    print "le nombe de voies xenobiotics est $com\n";
    print "fin\n";
    Nom : erreur.PNG
Affichages : 392
Taille : 69,8 Ko

  12. #12
    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
    Bonjour,
    en prenant le soin de bien formater ton code, tu verrais sans doute mieux ce problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    foreach my $x(@path){
        if ($x=~m/(.*\[PATH:ko\d{5}\].*)/) {
            $facto=$1;
        } else {
            push (@{$table{$facto}  },$x   );     
        } 
    }
    La variable $facto n'est correctement définie que si la condition du if est satisfaite, mais tu n'utilises cette variable que dans le cas contraire (dans le else).

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bonsoir
    oui mais ca marche encore pas le message d'erreur se presente à chaque fois mais c'est pas un gros probleme ca je trouvrerais une solution , j'ai un autre probleme en faite avec le dernier fichier du projet , voila quelque lignes

    =K02946 small subunit ribosomal protein S10 ; ko03010
    =K03784 purine-nucleoside phosphorylase [EC:2.4.2.1] ; ko00230 ko00240 ko00760
    =K01497 GTP cyclohydrolase II [EC:3.5.4.25]; K02858 3,4-dihydroxy 2-butanone 4-phosphate synthase ; ko00740

    j'ai enlevé le debut de la ligne et j'ai mets un signe = pour signaler un début de ligne , ce que j'essaie de faire est de quatifier tous ko\d{5} qui se trouve dans les lignes ou il ya KO\d{4} le probleme est que dés qu'il trouve un il s'arrete et recommence la recherche dans la ligne suivante par ex dans la 2 eme ligne ici il détecte que ko00760 mais pas les deux autres
    voila le code que j'ai fait jusqu'au mnt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    my %ortho_metabo;
    my $orthologue;
    foreach my $x(@genes){
       if ($x=~m/(K0\d{4}).*(ko\d{5}).*/g){@{$ortho_metabo{$1}=$2};}
     
     
     
    }
     
     
    print Dimper \%ortho_metabo;
    merci d'avance bonne soirée

  14. #14
    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
    Bonjour,

    ton problème est que le premier motif ".*" est "gourmand" (ou "avide"), c'est-à-dire qu'il cherche à reconnaître le plus possible de la chaîne tout en permettant la reconnaissance de la suite: dans ta deuxième ligne, il reconnaît " purine-nucleoside phosphorylase [EC:2.4.2.1] ; ko00230 ko00240 ", puisque cela permet à l'expression régulière de réussir.

    Le première chose à faire serait d'utiliser un motif "frugal", en ajoutant un point d'interrogation après le quantificateur: ".*?".

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    my $x = "K03784 purine-nucleoside phosphorylase [EC:2.4.2.1] ; ko00230 ko00240 ko00760";
    print $2 if $x =~ m/(K0\d{4}).*?(ko\d{5}).*/;
    permet de récupérer le premier des "ko\d{5}", et non le dernier, parce que le motif frugal ".*?" cherche à reconnaître le moins possible permettant à l'expression régulière de réussir.

    Si tu veux récupérer plusieurs groupes il faut ajouter des motifs et mettre le résultat dans un tableau. Par exemple, si ta ligne est dans la variable $_, tu peux essayer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @c =  m/(K0\d{4}).*?(ko\d{5})\s(ko\d{5})?\s(ko\d{5})?/;
    Le tableau @c contient maintenant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    0  'K03784'
    1  'ko00230'
    2  'ko00240'
    3  'ko00760'
    Sinon, tu peut aussi utiliser le modificateur "g" dans une boucle while.

    Ou utiliser split (avec par exemple le motif " : ") pour récupérer la fin de la ligne, et un nouveau split pour récupérer chacun des groupes présents.

  15. #15
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bonsoir ;
    merci beaucoup @lolo78
    j'ai galeré toute la nuit d'hier et aujourhui , je crois que c'es bon mnt avec le while et l'option \g , parceque j'ai tous le temps essayer avec if et option du petit g \g ca na pas marché mais là ca détecte tous je crois merci bcp

    bonne soirée

  16. #16
    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
    Bonsoir,

    un exemple sous le debugger Perl avec un while et le modificateur g:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      DB<1> $x =  "K03784 purine-nucleoside phosphorylase [EC:2.4.2.1] ; ko00230 ko00240 ko00760";
     
      DB<2> print "$1\n" while $x =~ /(ko\d{5})/g;
    ko00230
    ko00240
    ko00760

  17. #17
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bsr ;
    oui franchement c'est impecable j'ai pas pensé qu'il ya une différence avec le while et le if , ca m'as donné des résultats parfaite , il me reste encore 3 questions dans le projet , et deux jours avant de le rendre , trés long
    merci bcp pour l'aide que tu m'as apporté
    bonne soirée à tous

  18. #18
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    j'ai une petite qst par apport à une discussion qu'on a ouvert avant
    pour l'exemple que tu m'as donné pour les couleur
    my @couleurs = qw /
    ##bleus
    ciel
    marine
    outremer
    ##rouges
    cerise
    brique
    sang_de_boeuf
    ecarlate
    ##jaune
    d-or
    serein /;
    imaginons que je veux compter qu'à partir de la ligne ##rouges et s'arreter ##jaune cà d j'attend à une valeur de 4, t'as une idée comment j'arrete mon compteur exactement à un endroi précis et récupérer que la derniere valeur stp ??

  19. #19
    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
    Quand tu lis une ligne commençant pas ##, tu récupères le libellé (par ex. rouge) avec une expression régulière et initialises un compteur à 0. Ensuite tu incrémentes le compteur pour chaque ligne sans ##.

    Quand tu arrives à une nouvelle ligne avec ##, ton compteur a mesuré le nombre de valeurs (les sous-catégories de rouges, par exemple), tu t'en sers par exemple pour imprimer le nombre de rouges; ensuite tu récupères le nouveau libellé, réinitialise le compteur à 0, et ainsi de suite. Une fois la boucle de lecture finie, il faut encore afficher le dernier compteur.

  20. #20
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2016
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Novembre 2016
    Messages : 66
    Points : 40
    Points
    40
    Par défaut
    bjr , oui comme ca ca marche , mais si je veux compter que les sous categorie de rouge , ca me donne en faite tous la liste d'apres , dans l'exemple ca maffiche 6 par ex alors que j'attend 4

Discussions similaires

  1. Comparaison de deux Hashs
    Par nico38100 dans le forum Langage
    Réponses: 5
    Dernier message: 12/08/2013, 14h45
  2. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  3. Comparaison de deux tableaux en VB6
    Par taille50 dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 10/08/2007, 10h28
  4. Comparaison de deux tableaux
    Par solorac dans le forum Excel
    Réponses: 7
    Dernier message: 03/08/2007, 08h49
  5. Comparaison de deux tableaux
    Par siaoly dans le forum Langage
    Réponses: 5
    Dernier message: 27/06/2006, 19h40

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