2016-08-18 3 views
1

J'essaie finalement de combiner trois tableaux de lettres en utilisant List::MoreUtils::mesh, de sorte que je puisse ensuite comparer chaque position parmi les séquences. Par exemple, si j'ai trois fichiers qui ressemblent à:perl: recherche de fenêtre glissante le long du réseau de mailles

>file_1 
    TAGCTAGCCAGC-T 

la première comparaison serait entre TTT (ce compterait comme aucune substitution). Si les premières lettres sont TAA, cela compterait comme une substitution. Le premier défi consiste à comparer les trois lettres correspondantes.

Voici mon code à ce jour:

use strict; 
    use warnings; 
    use List::MoreUtils qw{mesh}; 

    open (SEQ_ONE, "<", "/path/to/file_1.txt") or die $!; 
    open (SEQ_TWO, "<", "/path/to/file_2.txt") or die $!; 
    open (REFERENCE, "<", "/path/to/reference_sequence.txt") or die $!; 

    my @first; 
    my @second; 
    my @reference; 
    my @combined; 
    my $sequence; 
    my $secondsequence; 
    my $thirdsequence; 
    my $windowsize = 3; 
    my $step = 3; 

    while (my $line = <SEQ_ONE>){ 
      chomp $line; 
      if ($line !~ /^>+/) { 
        $sequence .= $line; 
      } 
      @first = split //, $sequence; 
    } 

    while (my $secondline = <SEQ_TWO>){ 
      chomp $secondline; 
      if ($secondline !~ /^>+/){ 
        $secondsequence .= $secondline; 
      } 
      @second = split //, $secondsequence; 
    } 

    while (my $thirdline = <REFERENCE>){ 
      chomp $thirdline; 
      if ($thirdline !~ /^>+/){ 
        $thirdsequence .= $thirdline; 
      } 
      @reference = split //, $thirdsequence; 
    } 

    @combined = mesh @reference, @first, @second; 
    my $list = "@combined"; 

    for (my $windowstart = 0; $windowstart <= (length($list) - $windowsize); $windowstart += $step){ 
      my $windowSeq = substr($list, $windowstart, $windowsize); 
      print $windowSeq, "\n"; 
    } 

Cela semble briser les lettres en morceaux de lettres, en alternance dans des longueurs de 2 et 1 lettres. Sortie pour le code ci-dessus ressemble à:

T T 
    T 
    A A 
    A 
    G G 
    G 

J'ai expérimenté avec différentes tailles de fenêtres et de l'étape, mais je ne peut toujours pas obtenir la sortie désirée de trois lettres séparées à la fois. Je suis proche, mais pas tout à fait là. Merci pour l'aide.

+0

Votre ligne 'my $ list =" @combined ";' a le tableau interpolé _with espaces ajoutés entre les caractères. Je ne suis pas sûr que vous le vouliez - toute séquence de trois caractères doit alors avoir un ou deux espaces. Il me semble que vous voulez 'my $ list = join ', @combined;'. BTW, je ne comprends pas du tout la description de votre problème. – zdim

+0

Salut zdim, Merci pour votre réponse! Comment devrais-je améliorer ma question, le cas échéant? Peut-être que je pourrais juste le simplifier ... Merci encore. – Rob

+0

Il est bon que vous avez donné tout le code et décrit le problème! Cependant, vous avez utilisé le mot "_mesh_" et j'ai pensé que vous faisiez référence à une technique dans votre domaine. (J'ai ajouté le lien, j'espère que cela ne vous dérange pas.) Puis, avec "_count comme substitution_" je pensais que vous vouliez dire l'informatique, jusqu'à ce qu'il me tombe dessus que c'est la biologie. Je vous suggère d'éviter les termes de votre domaine, et si vous en avez besoin, expliquez-les brièvement. Aussi, bien que je vois le problème (espaces supplémentaires dans les chaînes), il n'est pas clair à partir de votre description. Donc, tout dépend de la façon dont les descriptions sont formulées. Mon $ .02. – zdim

Répondre

1

L'instruction my $list = "@combined"; génère une chaîne qui contient des éléments de tableau et des espaces ajoutés entre eux. Cela rejette complètement le traitement substr ci-dessous. La double-citation d'un tableau ("@array") est une commodité qui, une fois imprimée, est plus facile à lire. Ici vous voulez

my $list = join '', @combined;