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 :

Doublon a laffichage


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Par défaut Doublon a laffichage
    Bonjour,

    Jai un petit soucis avec un affichage de motifs: jai un doublon a chaque fois ke le script trouve la combinaison WalkerA_YY_LSGGQ......

    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
     
    	    if ($nb_TGIKV > 0) { 
    			if ($nb_PADVL > 0) { 
    			    print "$cur_header\n";  #TGIKV_PADVL
     
    			    if ($nb_YY ==1) { #the sequence contains the TGIKV_PADVL_YY motifs combination
    				print "$cur_header\n";
    			    }			    
    			}
     
    			elsif ($nb_YY == 1) {   #TGIKV_YY
    			    print "$cur_header\n";		
    			}
    		    }
     
    		    elsif ($nb_PADVL > 0){
    			if ($nb_YY == 1){  #PADVL_YY
    			    print "$cur_header\n";			    			    
    			}			    
    		    }
     
    		    elsif ($nb_WalkerA > 0) { #WalkerA
    			#print "$cur_header\n";
     
    			if ($nb_LSGGQ > 0) {  #WalkerA_LSGGQ
    			    print "$cur_header\n";
     
    			    if ($nb_YY > 0) {  # WalkerA_LSGGQ_YY
    				print "$cur_header\n";
    			    }
    			}
     
    			elsif ($nb_YY > 0) {  # WalkerA_YY
    			    print "$cur_header\n";
    			}
    		    }
     
    		    elsif ($nb_LSGGQ > 0) {  #LSGGQ
    			if ($nb_YY > 0) { #LSGGQ_YY
    			    print "$cur_header\n";
    			}
    		    }
    		}

  2. #2
    Expert confirmé
    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
    Par défaut
    A part le fait que ton formatage est assez mauvais... A quoi est censé servir ce code : a priori il fait toujours la même chose quelque soit le cas, qu'est-il censé faire ?
    NB : TGIKV_PADVL_YY est aussi en "doublon".
    Ma réaction devant ce code est qu'il a été mal pensé : un tel arbre d'alternative peut souvent s'élaguer énormément, et en fonction de ce qu'on lui demande, on peut employer une fonctionnalité avancé du langage pour le faire mieux et plus efficacement (ici je pense typiquement à un hash de fonctions).

    --
    Jedaï

  3. #3
    Membre expérimenté
    Avatar de GLDavid
    Homme Profil pro
    Head of Service Delivery
    Inscrit en
    Janvier 2003
    Messages
    2 890
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Head of Service Delivery
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 890
    Par défaut
    anne-so, quand tu postes, n'oublies pas de décocher la case "Désactiver le BBCode dans ce message" sinon ton code n'est pas bien mis en valeur
    Merci d'avance.

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code :tagcode: ni le tag :resolu:

    Je ne répond à aucune question technique par MP.

  4. #4
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Par défaut
    Salut,

    J'ai fait comme ca parce que je vois pas comment faire autrement... Jessaie juste d'afficher que les resultats utiles, a savoir les combinaisons de motifs suivantes:
    TGIKV_PADVL_YY
    TGIKV-PADVL
    TGIKV-YY
    PADVL-YY
    WalkerA_LSGGQ-YY
    WalkerA_LSGGQ
    WalkerA_YY
    LSGGQ_YY

  5. #5
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Par défaut
    et pourrais tu mexpliquer dou viennent ces doublons?

  6. #6
    Expert confirmé
    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
    Par défaut
    TGIKV_PADVL_YY
    TGIKV-PADVL
    TGIKV-YY
    PADVL-YY
    WalkerA_LSGGQ-YY
    WalkerA_LSGGQ
    WalkerA_YY
    LSGGQ_YY
    Tu veux donc afficher les motifs précédents, pourquoi donc faire alors un gigantesque arbre d'alternatives, alors qu'il suffit de tester si ton motif est l'un de ceux là ? Tu peux le faire ainsi :
    - Faire une liste des motifs acceptés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @goodPatterns = (TGIKV_PADVL_YY, TGIKV_PADVL, TGIKV_YY, PADVL_YY, WalkerA_LSGGQ_YY, WalkerA_LSGGQ, WalkerA_YY, LSGGQ_YY );
    - Vérifier que ton motif est l'un d'entre eux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    foreach my $pattern ( @goodPatterns ){
      print "$cur_header\n" and last if $cur_header eq $pattern;
    }
    La méthode ci-dessus n'est en réalité pas la plus rapide/optimisée, le mieux serait sans doute de faire un hash dont les clés seraient les motifs acceptés, et d'utiliser exists() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    my %goodPatterns = (TGIKV_PADVL_YY => 1, TGIKV_PADVL => 1, TGIKV_YY => 1, PADVL_YY => 1, WalkerA_LSGGQ_YY => 1, WalkerA_LSGGQ => 1, WalkerA_YY => 1, LSGGQ_YY => 1 );
     
    print "$cur_header\n" if exists $goodPatterns{$cur_header};
    --
    Jedaï

  7. #7
    Expert confirmé
    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
    Par défaut
    Citation Envoyé par anne-so
    et pourrais tu mexpliquer dou viennent ces doublons?
    Ces doublons viennent d'une faille dans ta logique : en effet tes motifs sont mutuellement exclusifs, mais dans tes alternatives tu fais des imbrications comprenant des instructions à deux niveaux... Ce n'est pas logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    # si $cur_header est TGIKV_PADVL_YY
    if ($nb_TGIKV > 0) {
      if ($nb_PADVL > 0) {
        #on imprime TGIKV_PADVL_YY une première fois
        print "$cur_header\n";  #TGIKV_PADVL
     
        if ($nb_YY ==1) { #the sequence contains the TGIKV_PADVL_YY motifs combination
          #on imprime TGIKV_PADVL_YY une seconde fois
          print "$cur_header\n";
        }
      }
    }
    --
    Jedaï

  8. #8
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Par défaut
    en fait, jai du mal explique ce que je fais. je chercher differents motifs (PADVL, TGIKV, YY, WalkerA, LSGGQ) et je veux nafficher que certaines combinaisons de motifs. je sais pas si la solution que tu me proposes marchent pour ca (meme si cest apparement beaucoup plus simple! )

  9. #9
    Expert confirmé
    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
    Par défaut
    Qu'y a-t-il donc dans $cur_header ? Y a-t-il exactement la chaîne "TGIKV_PADVL_YY" par exemple ou est-ce plus compliqué ?

    --
    Jedaï

  10. #10
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Par défaut
    Citation Envoyé par Jedai
    Qu'y a-t-il donc dans $cur_header ? Y a-t-il exactement la chaîne "TGIKV_PADVL_YY" par exemple ou est-ce plus compliqué ?

    Voici le contenu de $cur_header:
    > Acinetobacter sp. ADP1 [gi 50083300 |DNA replication, recombinaison and repair protein ] : YY (149) WalkerA (30) LSGGQ (85)

  11. #11
    Expert confirmé
    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
    Par défaut
    Ok !! Voilà qui est beaucoup plus clair !

    Voici donc une solution dans la même idée que la première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    my @goodPatterns = ( [qw(TGIKV PADVL YY)], [qw(TGIKV PADVL)], [qw(TGIKV YY)], [qw(PADVL YY)], [qw(WalkerA LSGGQ YY)], [qw(WalkerA LSGGQ)], [qw(WalkerA YY)], [qw(LSGGQ YY)] ); 
     
    foreach my $pattern ( @goodPatterns ){
      my $success = 1;
      foreach my $part ( @$pattern ){
        unless( $cur_header =~ /$part/ ){
          $success = 0;
          last;
        }
      }
      print "$cur_header\n" and last if $success;
    }
    --
    Jedaï

  12. #12
    Expert confirmé
    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
    Par défaut
    On peut faire mieux si tu changes un peu ton programme pour que "$nb_TGIKV" devienne "$nb_pattern{TGIKV}". Parce que j'imagine que ces nombres sont égaux à ce qui est entre parenthèses derrière le motif correspondant ?
    Si c'est le cas, le changement que je te propose accélérera pas mal les choses. (Et il est simple à faire : tu déclares "my %nb_pattern;" au début de ton script, puis tu fais un Chercher/Remplacer sur "$nb_TGIKV" pour le remplacer par "$nb_pattern{TGIKV}")
    Je te conseille vraiment de le faire, en plus ça augmentera la souplesse de ton programme.

    --
    Jedaï

  13. #13
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 16
    Par défaut
    en fait $nb_TGIKV correspond au nombre d'occurence de ce motif dans une séquence. je men servais dans mon arbre de recherche. le nombre entre parenthèse correspond à la position du motif dans la séquence que je récupère avec la fonction pos() et que je stocke dans un tableau.

    merci pour l'aide!

Discussions similaires

  1. Requete de comptage de doublons spéciale
    Par COliveOnTheNet dans le forum Langage SQL
    Réponses: 3
    Dernier message: 08/09/2003, 10h11
  2. PB: Insertion de doublon
    Par maxvador dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/09/2003, 12h07
  3. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  4. tri a bulle sans les doublons
    Par comme de bien entendu dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 10/03/2003, 16h29
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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