выровняйте 2 последовательности ДНК и найдите комплементарные области - PullRequest
0 голосов
/ 23 ноября 2011

Я пытался найти какую-то подсказку в списке, но не смог, так что извините, если я задаю повторную тему

Я новичок в PERL и пытаюсь написать программу на PERL, в которой будет две ДНК.последовательности, вычислите обратное значение второго и найдите максимальное количество дополнительных областей между ними, а именно:

вход:

CGTAAATCTATCTT
CATGCGTCTTTACG

выход:

CGTAAATCTATCTT
GCATTT--------

IУ меня нет проблем с поиском обратной последовательности, однако мои навыки программирования на PERL зачаточны.Нужно ли использовать комбинированные петли для каждого элемента?

Ответы [ 2 ]

3 голосов
/ 23 ноября 2011

Это у вас работает?

#!/usr/bin/perl
use warnings;
use strict;

sub complement {
    $_[0] =~ y/CGAT/GCTA/;
    return $_[0];
}

sub match {
    my ($s1, $s2) = @_;
    $s2 = reverse $s2;
    complement $s2;
    print "$s1\n";
    my $s2l = length $s2;
    for (my $length = $s2l; $length; $length--) { # start from the longest possible substring
        for my $start (0 .. $s2l - $length) {     # starting position of the matching substring
            my $substr = substr $s2, $start, $length;
            my $pos = index $s1, $substr;
            if ($pos + 1) {
                return ('-' x $pos) . complement "$substr" . ('-' x ($s2l - $length - $pos));
            }
        }
    }
}

print match('CGTAAATCTATCTT',
            'CATGCGTCTTTACG')
    ,"\n";
1 голос
/ 23 ноября 2011

Возможно, это то, что вы хотите (грубо):

#!/usr/bin/env perl
use strict;
use warnings;
die unless @ARGV == 2 && length $ARGV[0] == length $ARGV[1];
my @seq1 = split //, $ARGV[0];
my @seq2 = split //, reverse $ARGV[1];
my @comp;
for my $n (0..@seq1-1) {
    if   ( ($seq1 [$n] eq 'A' && $seq2 [$n] eq 'T') 
        || ($seq1 [$n] eq 'T' && $seq2 [$n] eq 'A') 
        || ($seq1 [$n] eq 'G' && $seq2 [$n] eq 'C') 
        || ($seq1 [$n] eq 'C' && $seq2 [$n] eq 'G') ) {
        push @comp, $seq2[$n];
    }
    else {
        push @comp, '-';
    }
}
print @seq1, "\n", @comp, "\n";

... который при запуске:

# ./compseq CGTAAATCTATCTT CATGCGTCTTTACG
CGTAAATCTATCTT
GCATTT------A-
...