Script à faire

Résolu
lypso15 Messages postés 6 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, j'ai un script à écrire, consistant à déterminer à quel groupe appartient la séquence donnée, en fonction de motifs qu'elle contient

pour déterminer les groupes, j'ai deux motifs pour chacun
groupe 1 :
AMRRVVTLSYNHLPSHLKPCFLYLSIFPEDFEIQRKRLVDRWIAEGFVRA
YDIEDCLDEFMVHVKSQSLSRQLMKLKDRHRIAIQIRBLKSRVEEVSNRN

groupe 2 :
DHQVKDWMKQVRDVAYDIEDCIDDFAHRL
VKSLVGKLGSLLAQEYTLIRGVRGDIQYJNDELASMQAFLR

groupe 3 :
SYNNLPHHLKTCLLYLGMYPEDYIIWKDDLVKQWIAEGFISAVEGLDAEE
EQKLKVVSIVGFGGLGKTTLAKZVYRKJ

Pour l'instant j'essaie de faire qu'avec le premier groupe ceux qui donne ceux ci :
#!/usr/bin/perl

use strict;
my $seq;
my $nb=0;


open (FILE,"$ARGV[0]")||die"cannot open$_";
while(<FILE>)
{
 if(/^[^>]/)
 {
  chomp; 
  $seq.=$_;
  #print "$seq";
 }
}
print "$seq\n";
if ($seq==~ m/AMRRVVTLSYNHLPSHLKPCFLYLSIFPEDFEIQRKRLVDRWIAEGFVRA/ || m/YDIEDCLDEFMVHVKSQSLSRQLMKLKDRHRIAIQIRBLKSRVEEVSNRN/)
{
 $nb ++;
 print "la séquences appartient au groupe $nb\n";
}
 else 
 {
  print "la sequence n'appartient pas au groupe 1\n";
 }

Sauf le probléme c'est qu'en testant n'importe qu'elle séquence, il me retourne qu'elle appartient toute au groupe 1, alors que certaines n'en font pas partis, où serai mon erreur ?

2 réponses

  1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
     
    Bonjour,

    Cela fait longtemps que je n'ai pas fait de PERL ...
    mais quand on fait un IF avec plusieurs conditions... il faut mettre les conditions "en entier" !
    if ($seq==~ m/AMRRVVTLSYNHLPSHLKPCFLYLSIFPEDFEIQRKRLVDRWIAEGFVRA/ || $seq==~ m/YDIEDCLDEFMVHVKSQSLSRQLMKLKDRHRIAIQIRBLKSRVEEVSNRN/)
    

    0
    1. lypso15 Messages postés 6 Statut Membre
       
      effectivement vous avez raison mais cela ne règle pas le problème
      0
  2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Je ne comprends pas très bien ce que tu testes et comment du veux tester.

    Un exemple de ce qui peut se trouver dans $seq et qui remplit ta condition permettrait d'y voir plus clair.

    Si la condition est remplie si $seq comprend "AMRRVVTLSYNHLPSHLKPCFLYLSIFPEDFEIQRKRLVDRWIAEGFVRA" ou "YDIEDCLDEFMVHVKSQSLSRQLMKLKDRHRIAIQIRBLKSRVEEVSNRN", tu dois indiquer la deuxième partie de la condition comme le dit Jordane.

    Cependant, je pense que tu veux plutôt faire
    if ($seq=~ 
    et non
    if ($seq==~
    .

    Tu devrais mettre
    use warnings;
    après
    use strict;
    , qui t'aurait avertit d'un code anormal.

    Dal
    0
    1. jordane45 Messages postés 30426 Date d'inscription   Statut Modérateur Dernière intervention   4 830
       
      Hello Dal,
      Et pour la comparaison.... je ne sais pas comment se comporte une 'séquence' .
      Mais ne serait-ce pas comme du "text" ? et dans ce cas utiliser le equal (ou not equal ) => "eq" au lieu du "==" ?
      (== qui sert à comparer des nombres si ma mémoire est bonne )
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      oui en Perl,
      ==
      est l'opérateur d'égalité numérique, pour comparer l'égalité de chaînes, c'est bien
      eq
      ... tout est là :

      https://perldoc.perl.org/perlop#Equality-Operators

      :-)

      mais dans le code posté c'est une regexp qui est appliquée à une variable, afin de vérifier si elle matche, cela serait donc l'opérateur
      =~
      qui est un "binding operator" qui lie l'expression scalaire contenue dans la variable à la regexp qu'elle est supposée matcher :

      https://perldoc.perl.org/perlop#Binding-Operators
      0
    3. lypso15 Messages postés 6 Statut Membre
       
      Une séquence c'est juste une succession de plusieurs centaines de lettres, sans aucun espace.
      Par contre je recherches pas une séquences totalement identique au motif, mais dans une séquence beaucoup plus grande je cherches a voir si le motif est présent ou non, du coup eq ne sera pas approprier si ?
      0
    4. lypso15 Messages postés 6 Statut Membre
       
      voici un exemple de se que contient $seq :

      >LPERR06G01240.1 pep chromosome:Lperr_V1.4:6:801466:804082:-1 gene:LPERR06G01240 transcript:LPERR06G01240.1 gene_biotype:protein_coding transcript_biotype:protein_coding
      MEENTTFDETDSMEDVRNYSPSNIDEAELVGFDTPKRELLDKMNIDGNDGHCKVLCVVGM
      GGLGKTTLARKIFESKEDIGKNFPCRAWITVSQSFSKLEMLKDMISQLLGTESLKKCLKE
      LEGKAMRVHDLAAYLRDRLKEENFALPSTNNRGSRVIVTTRVDGVANACTSKPFVYHLKL
      LEKGPAIDLLLRKIGKNREDMENDDKLKNIATQLVKKCGCLPLAILTIGAMFANKRPSKW
      EEMCIQLPSELESNPSSETEAIMRVVTLSYSHLPSHLKPCFLYLSIFPEDFEIKRRHLVD
      RWIAEGQVRARVGMTISDVGESYFDELISRSMIQPSIVNMEGRVKSCRVHDIMRDIIVSI
      SKEENFVYSTGDNVPTIVLEKFRHVSYHGGNCPIVGMDFSHVRSLTVFGEFGQRPMLFGS
      SICSPQFTMLRALDLENAEFPVTQKDINNIGLLRHLRYLYMNNRRRSYIYTLPRSIGKLQ
      NLQVLDIRRNHISTLPTDISKLLMLRVLHCTNVMVYSYFHPHKPIRNLALMCCMPLIWTP
      LVRSTERNEFIAELHKAYSSHWSRTTGVRVLEVVDIKLTKTKAIEELGELHRLKKLSVTT
      KGAQDNKCKILCDAIEKLSSLRSLDFDGTGTGDHGTGTFEWLGPSNFSPSPLLRKLTLIG
      CIRVLPDCFRDLKHLRKIILGFSQLDDRAIKILGTLPNLVLLALNGDAFAGKKLAFKERE
      FPNLRELRILGMLQLSGIRFEKNTLPHMEIIEIRYCELKSGIVGIKHLEQLKEITLQCLV
      AGFNLLEEEVKAHPKEPRLWQLTEEIDIEMGSPVVLTEDEGSEDDRGSNRIGESSQVISS
      L

      les deux premières lignes sont supprimées grâce au while, elles ne sont pas utile pour la recherche de motif
      0
    5. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      sauf erreur, dans cet exemple $seq n'est pas du tout identique et ne comprend pas non plus l'un quelconque des motifs

      comme indiqué, l'opérateur
      eq
      permet de vérifier que deux chaînes sont (exactement) identiques

      par exemple :

      my $st = "toto";
      
      if ($st eq "toto") {
          print "C'est bien toto\n";
      }


      si tu cherches si une chaîne est contenue dans une autre, tu peux utiliser une regexp, comme tu sembles vouloir le faire, par exemple :

      my $st = "tititototutu";
      
      if ($st =~ m/toto/) {
          print "Il y a bien toto dedans\n";
      }
      0