我试图在列表中找到一些线索,但我找不到,如果我问了一个重复的话题,很抱歉
我是 PERL 初学者,我正在尝试用 PERL 编写一个程序,该程序采用两个 DNA 序列,计算第二个序列的倒数并找到它们之间的最大互补区域,即:
输入:
CGTAAATCTATCTT
CATGCGTCTTTACG
输出:
CGTAAATCTATCTT
GCATTT--------
我可以毫无问题地找到第二个序列的反面,但是我在 PERL 中的编程技能还很初级。我需要为 foreach 循环使用组合吗?
我试图在列表中找到一些线索,但我找不到,如果我问了一个重复的话题,很抱歉
我是 PERL 初学者,我正在尝试用 PERL 编写一个程序,该程序采用两个 DNA 序列,计算第二个序列的倒数并找到它们之间的最大互补区域,即:
输入:
CGTAAATCTATCTT
CATGCGTCTTTACG
输出:
CGTAAATCTATCTT
GCATTT--------
我可以毫无问题地找到第二个序列的反面,但是我在 PERL 中的编程技能还很初级。我需要为 foreach 循环使用组合吗?
这对你有用吗?
#!/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";
也许这就是你想要的(粗略地):
#!/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-