2009-05-06 8 views
3

J'ai écrit le script suivant pour rechercher un motif (sous-chaîne) dans une séquence de protéines (chaînes). Je suis débutant et écrire cela a été difficile pour moi. J'ai deux questions concernant la même chose: 1. Erreurs: Le script suivant a quelques erreurs. Je suis là depuis assez longtemps maintenant mais n'ai pas compris quoi et pourquoi? 2. Le script suivant a été écrit pour rechercher un motif (sous-chaîne) dans des séquences de protéines (chaînes). Ma tâche suivante consiste à rechercher de multiples motifs dans un ordre spécifique (ex: motif1 motif de motif2 3 motif4 cet ordre ne peut pas être changé) dans les mêmes séquences de protéines (chaînes)Recherche de motif dans la séquence protéique?

 use strict; 
     use warnings; 

     my @file_data=(); 
     my $motif =''; 
     my $protein_seq=''; 
     my $h= '[VLIM]'; 
     my $s= '[AG]'; 
     my $x= '[ARNDCEQGHILKMFPSTWYV]'; 
     my $regexp = "($h){4}D($x){4}D"; #motif to be searched is hhhhDxxxxD 
     my @locations=(); 

     @file_data= get_file_data("seq.txt"); 

     $protein_seq= extract_sequence(@file_data); 

    #searching for a motif hhhhDxxxxD in each protein sequence in the give file 

     foreach my $line(@file_data){ 
     if ($motif=~ /$regexp/){ 
     print "found motif \n\n"; 
     } 
     else { 
     print "not found \n\n"; 
     } 
     } 
#recording the location/position of motif to be outputed 

     @locations= match_position($regexp,$seq); 
     if (@locations){ 
     print "Searching for motifs $regexp \n"; 
     print "Catalytic site is at location:\n"; 
     } 
     else{ 
     print "motif not found \n\n"; 
     } 
     exit; 

     sub get_file_data{ 
     my ($filename)[email protected]_; 
     use strict; 
     use warnings; 
     my $sequence=''; 

     foreach my $line(@file_data){ 

     if ($line=~ /^\s*$/){ 
     next; 
       } 
     elsif ($line=~ /^\s*#/){ 
     next; 
     } 
     elsif ($line=~ /^>/){ 
     next; 
     } 
     else { 
     $sequence.=$line; 
     } 
     } 
     $sequence=~ s/\s//g; 
     return $sequence; 
     } 

     sub(match_positions) { 
     my ($regexp, $sequence)[email protected]_; 
     use strict; 
     my @position=(); 
     while ($sequence=~ /$regexp/ig){ 
     push (@position, $-[0]); 
     } 
     return @position; 
     } 

Répondre

3
  1. Tout d'abord, le mot-clé est elsif, en second lieu, vous n'en avez pas besoin. Vous pouvez compresser le code dans la boucle get_file_data à:

    next if $line =~ /^\s*$|^>/; 
    $sequence .= $line; 
    

    Tant que vous allez utiliser des expressions régulières - à moins que trop difficile à manier - vous pouvez rechercher aussi bien pour tous les cas que vous voulez ignorer . Si vous trouvez ce second cas réel, vous pouvez l'ajouter comme un autre alternance. Supposons que vous vouliez exclure les lignes commençant par #-. Ensuite, vous suffit d'ajouter dans comme ceci: /^\s*$|^>|^#-/

  2. Une autre chose est que doit avoir la @ Sigil, avant la position, ou autre, perl pense que vous essayez de bidouilles avec un appel à position().

  3. Vous devez les modifications suivantes:

    my $h= '[VLIM]'; 
    my $s= '[AG]'; 
    my $x= '[ARNDCEQGHILKMFPSTWYV]'; 
    

    Sinon, vous êtes juste à l'attribution $h à une référence de tableau avec une seule fente peuplée de toutes celles qui seraient de retour de la sous VLIM.

  4. Troisièmement, n'utilisez pas $&. Remplacer pos($sequence)-length($&)+1

    push @positions, $-[0]; 
    

    ou mieux encore, utilisez English:

    use English qw<-no_match_vars>; 
    ... 
    push @positions, $LAST_MATCH_START[0]; 
    
  5. je suggère ce qui suit pour la lecture du fichier:

    use IO::File; 
    ... 
    # Use real file handles 
    my $fh = IO::File->new("<seq.txt"); 
    get_file_data($fh); # They can be passed 
    ... 
    sub get_file_data{ 
        my $file_handle = shift; 
        ... 
        # while loop conserves resources 
        while (my $line = <$file_handle>) { 
         next if $line =~ /^\s*$|^>/; 
         $sequence .= $line; 
        } 
    
  6. Une suggestion pour aller de l'avant - il m'aide immensément:

    A. Installer Smart::Comments

    B. Mettre cela en haut de votre script:

    use Smart::Comments; 
    

    C. Chaque fois que vous n'êtes pas sûr de ce que vous avez à ce jour, comme si vous vouliez voir le contenu actuel de $sequence, placez ce qui suit dans le code:

    ### $sequence 
    exit 0; 
    

    juste le montrer et la sortie.Lorsque vous obtenez trop d'impressions, supprimez-les.

+0

@axeman: modifications effectuées. – shubster

0
  • Utilisez "ELSIF" au lieu de "elseif".
  • Est-ce que @file_data et @fasta_file_data sont censés être la même chose?

En match_positions:

  • Retirez les parenthèses autour du nom sous.
  • Remplacez "ma position" par "ma @position".
  • Remplacez le motif de/regexp/ig par/$ regexp/ig.
+0

@Nathan Kitchen: changements faits – shubster

+0

oui, ils sont les mêmes et je l'ai changé. – shubster

+0

Je ne pense pas qu'ils devraient l'être. @fasta ... contient les lignes de l'entrée, mais l'autre contient les autres lignes. Vous semblez transmettre à get_file_data le nom du fichier, mais en sautant juste au point où vous l'avez lu dans un tableau. S'il vous plaît voir ma # 5, pour savoir comment en faire une réalité. – Axeman

Questions connexes