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 :

[langage] Flags et listes


Sujet :

Langage Perl

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut [langage] Flags et listes
    Salut à tous!

    Je cherche à savoir comment fait pour activer un drapeau en perl qui prendra la valeur vraie ou faux?

    Du genre if $orf_démarré = FAUX {...}
    J'arrive pas à l'écrire comme il faut et du coup ca ne marche pas.

    Et j'ai un autre problème comment fait pour ajouter une suite de caractères dans une liste : par exemple ajouter $polypep_orf à @liste_orf

    Merci d'avance pour vos réponses parce que je vais craquer si ca marche pas lol;

    Claire

  2. #2
    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
    j'ai pas tres bien compris ton premier souci. tu veux faire une action si condition fausse?
    alors tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if (! condition ) { condition etait fausse}
    ou
    unless (condition) {condition etait fausse}
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $nb = 3;
    unless ($nb eq "2") {print "1: chiffre different de 2\n";}
    ou 
    if ($nb ne "2") {print "2: chiffre different de 2\n";}
    ou
    if (! ($nb eq "2")) {print "3: chiffre different de 2\n";}
    reexplique please. Par contre pour rajouter une chaine de caractere à une liste, tu peux faire un push
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    push (@liste_orf , $polypep_orf);
    voilà

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse;
    En fait ma variable $ORF_demarre devient Vrai quand elle rentre le caractère 'M' et jusqu'à un caractère '*'. Et la boucle ne doit tourner que qd cette condition est vraie. ca donne ca en 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
     
      my $polypep_ORF = '';
      my $ORF_demarre = FAUX; ## comment écrire ca de facon à ce que ca marche!##
     
      my $taille = length($polypepb);
     
        for(my $j=1; $j<=$taille; $j= $j+1){
        my$acide_amine = substr($polypepb,$j-1,1);
     
          #Pour démarrer un ORF
     
          if($acide_amine eq 'M') {
          $ORF_demarre = VRAI;
     
         }
          #Etendre un ORF en cours
     
          if ($ORF_demarre = VRAI) {
          $polypep_ORF = $polypep_ORF.$acide_amine;
     
          }
     
          #Terminer un ORF en cours
     
          if ($ORF_demarre eq '*') {
          $ORF_demarre = FAUX;
          push(@liste_orf,$polypep_ORF);
         # $polypep_ORF = '';
          }
        }
    J'espère que ca sera plus clair!

  4. #4
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    En perl, un scalaire (une variable) correspond à FAUX si sa valeur est :
    - 0 (le nombre)
    - "" (une chaine vide)
    - undef (une valeur spéciale indiquant que la variable n'est pas utilisée (définie))

    Toutes les autres valeurs sont VRAI lors de tests logiques.

    En te souhaitant la bienvenue sur nos forums (ce sont tes deux premiers posts ) et une bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  5. #5
    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
    Un(e) bioinformaticien(ne) de plus
    bah pourquoi ne pas faire simplement
    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
     
    my $polypep_ORF = ''; 
      my $ORF_demarre = "FAUX"; # initialisé à faux  
      my $taille = length($polypepb); 
     
        for(my $j=1; $j<=$taille; $j= $j+1){ 
        my $acide_amine = substr($polypepb,$j-1,1); 
     
          #Pour démarrer un ORF 
     
          if($acide_amine eq 'M') { 
          $ORF_demarre = "VRAI"; 
     
         } 
          #Etendre un ORF en cours 
     
          if ($ORF_demarre eq "VRAI") { 
          $polypep_ORF = $polypep_ORF.$acide_amine; 
     
          } 
     
          #Terminer un ORF en cours 
     
          if ($ORF_demarre eq '*') { 
          $ORF_demarre = "FAUX"; 
          push(@liste_orf,$polypep_ORF); 
         # $polypep_ORF = ''; 
          } 
        }

  6. #6
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par djibril
    Un(e) bioinformaticien(ne) de plus
    Ah, la la la la !

    Ceci dit, algorithmiquement, tu as un défaut : tu ne termines jamais les ORF en cours, puisque je ne te vois jamais fixer $ORF_demarre à "*".

    Bon courage.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Effectivement comme ca ca commence quand on rencontre un 'M' mais ca ne s'arrête pas quand on rencontre un '*'.
    Comment faire je craque lol.
    Et par contre je comprend pas j'arrive pas à ajouter le résultat qu'on trouve dans la liste

  8. #8
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Je ne suis pas Bio-Info Pur Info, j'ai donc besoin de quelques données supplémentaires (même si j'ai encore de bonnes bases en bio).

    Tes ORF commencent avec un M et se terminent avec une * dans la chaine $polypepb ? C'est bien ça ?

    Et ce que tu veux au final, c'est une liste de tous les ORF contenus dans $polypepb ?

    Si oui (aux deux questions), il y a peut-être un moyen de tout simplifier et de tout faire en une ligne de code au moyen des expressions rationnelles ... bon, Ok, 2 ou 3 lignes, 5 à tout casser avec les commentaires 8)
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  9. #9
    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
    resumons, si ton orf ressemble à
    $orf = "Myuiucd GDYUBYTKVYRT*dsge";
    tu voudrais recupere Myuiucd GDYUBYTKVYRT c'est ça??
    alors une regex suffit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $orf =~ /^(m.+)*/i;
    $polypep_ORF = $1;
    push(@liste_orf,$polypep_ORF);
    tu lis ta sequence et recupere de la methionine M au premier codon stop trouvé * via une expression reguliere. Ensuite ta chaine est mise dans ton tableau @liste_orf à la case suivante

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Oui c'est bien ca. Je cherche dans polypepb tous les ORF qui commence par un M et finisse par un *
    Merci de ton aide

  11. #11
    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
    donne un exemple des sequence que tu traites!

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Alors comme exemple au pif :

    $polypepb= 'ACGATMATAT*ASPMRTSXNY*TF'

    On cherche donc à avoir dans la liste
    @liste_orf = ('MATAT','MRTSXNY')

    Voila, voila!!!
    Claire

  13. #13
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Alors, voici la magie de Perl (qui a dit sorcellerie ? qu'on le mène au bûcher !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my $polypepb= 'ACGATMATAT*ASPMRTSXNY*TF' ;
    @liste=($polypepb =~ m/(M.+?)\*/g);
    Et tout est fait !

    Moi j'aime bien. 8)

    Veux-tu des explications ?
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Ca marche!!!!!!!!
    Par contre je veux bien les explications lol parce que ca fait un peu sorti de nul part mdr.
    En tout cas merci beaucoup je suis super contente
    Claire

  15. #15
    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
    rajoute un i pour la casse et pas besoin du m pour match
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    my $polypepb= A*CGmAThmrddMATAT*ASPMRTSXNY*TF; 
    my @liste=($polypepb =~ /(m.+?)\*/gi); 
    $, =" ,";
    print @liste;

  16. #16
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    @liste=($polypepb =~ m/(M.+?)\*/g);
    L'opérateur =~ fait la mise en correspondance avec une expression rationnelle.

    Celle ci est "m/(M.+?)\*/g" :
    - m pour match (recherche de correspondance). C'est l'opération par défaut, mais j'ai l'habitude de la préciser quand j'utilise =~.
    - (M.+?) est entre parenthèses, pour que ce soit la partie mémorisée de notre mise en correspondance.
    - M.+? signifie un "M", suivi de caractères quelconques (le '.'), en nombre quelconque > 1 (le '+'), mais en en prenant le moins possible (le '?').
    - \* signifie le caractère '*'. On est obligé de le backquoter, sinon il prend une signification indiquant une répétition.
    - g enfin est un indicateur pour traiter toutes les occurences de notre motif, et pas seulement la première (g comme global). On peut, ici préciser 'i' pour être "case-insensitive.

    Et toute la magie est que cet opération (variable =~ RegExp) retourne une liste des correspondances trouvées. On la range donc directement dans @liste.

    Cool, non? 8)
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup pour tes explications c'est super gentil.
    J'ai encore une petite question :
    Comment faire pour que le résultat de mon programme aille à la ligne quand il arrive au bout de l'écran.
    Je sais pas trop comment expliquer En fait pour le moment même si mon résultat fait 10000 caractères (lol) il reste sur une seule ligne.

    MErci d'avance
    Claire

  18. #18
    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
    un \n dans ton print equivaut à un retour chariot.
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "ma ligne 1 \n ma deuxieme ligne \n";

  19. #19
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Avec ce séparateur de saut de ligne, diverses options s'offrent à toi, selon le cas.

    Si affiches la liste ainsi : alors tu peux altérer le séparateur pour ajouter les sauts de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $,=",\n"; print @liste;
    Tu peux aussi (plutôt) choisir d'afficher la liste par un parcours explicite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "$_\n"  foreach (@liste);
    Et si le problème est qu'un élément (une seule chaine) est trop long, alors une expression rationnelle bien sentie peut le tronçonner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = 'a' x 333; # une chaine de 333 caractères 'a'
    $a =~ s/(.{40})/$1\n/g; # Et un peu de découpage en blocs de 40 caractères;
    print "$a\n"; # mais toujours en une seule chaine !
    Voila, je crois que l'on approche très fort de la résolution de ton problème 8)

    Bonne continuation.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 19
    Points : 5
    Points
    5
    Par défaut
    Merci beaucoup ca marche super.
    Claire

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [langage] Parcourir une list de array
    Par nledez dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2004, 17h11
  2. Réponses: 8
    Dernier message: 02/04/2004, 17h31
  3. [langage] tri avancé, liste de listes
    Par schnecke dans le forum Langage
    Réponses: 6
    Dernier message: 29/03/2004, 14h00
  4. [langage] random sur liste ou tableau
    Par martijan dans le forum Langage
    Réponses: 2
    Dernier message: 15/07/2003, 14h47
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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