String 确定2条主股的匹配与不匹配比率?

String 确定2条主股的匹配与不匹配比率?,string,perl,dna-sequence,String,Perl,Dna Sequence,可能重复: 我试图编写一个Perl脚本,比较两个对齐的DNA序列(每个长度60个字符),然后显示序列之间匹配与不匹配的比率。但我运气不太好。如果它有帮助,我可以上传我的代码,但它没有用。下面是我试图实现的一个例子 e、 g A T C G T A C | | | | | | | T A C G A A C 因此,上述示例的匹配项为4。非匹配项为:3。给它一个4.3的比率 任何帮助都将不胜感激。谢谢。一般来说,请发布您的代码。它确实有用。在任何情况下,像这样的事情都应该满足您的要求: #!/u

可能重复:

我试图编写一个Perl脚本,比较两个对齐的DNA序列(每个长度60个字符),然后显示序列之间匹配与不匹配的比率。但我运气不太好。如果它有帮助,我可以上传我的代码,但它没有用。下面是我试图实现的一个例子

e、 g

A T C G T A C
| | | | | | |
T A C G A A C
因此,上述示例的匹配项为4。非匹配项为:3。给它一个4.3的比率


任何帮助都将不胜感激。谢谢。

一般来说,请发布您的代码。它确实有用。在任何情况下,像这样的事情都应该满足您的要求:

#!/usr/bin/perl -w
use strict;
my $d1='ATCGTAC';
my $d2='TACGAAC';

my @dna1=split(//,$d1);
my @dna2=split(//,$d2);

my $matches=0;
for (my $i=0; $i<=$#dna1; $i++) {
    $matches++ if $dna1[$i] eq $dna2[$i];
}
my $mis=scalar(@dna1)-$matches;
print "Matches/Mismatches: $matches/$mis\n";
#/usr/bin/perl-w
严格使用;
我的$d1='ATCGTAC';
我的$d2='TACGAAC';
my@dna1=拆分(/,$d1);
my@dna2=拆分(/,$d2);
我的$matches=0;

对于(my$i=0;$i只需获取其中一个字符串的长度(我们假设字符串长度相等,对吗?),然后使用
substr
进行迭代

my @strings = ( 'ATCGTAC', 'TACGAAC' );

my $matched;
foreach my $ix ( 0 .. length( $strings[0] ) - 1 ) {
  $matched++
    if   substr( $strings[0], $ix, 1 ) eq substr( $strings[1], $ix, 1 );
}

print "Matches: $matched\n";
print "Mismatches: ", length( $strings[0] ) - $matched, "\n";
通常我会说“你尝试了什么”和“先上传你的代码”,因为这似乎不是一个很难解决的问题。但让我们来试一试:

创建两个数组,一个用于保存每个序列:

@sequenceOne = ("A", "T", "C", "G", "T", "A", "C");
@sequenceTwo = ("T", "A", "C", "G", "A", "A", "C");
$myMatch = 0;
$myMissMatch = 0;

for ($i = 0; $i < @sequenceOne; $i++) {
    my $output = "Comparing " . $sequenceOne[$i] . " <=> " . $sequenceTwo[$i];
    if ($sequenceOne[$i] eq $sequenceTwo[$i]) {
        $output .= " MATCH\n";
        $myMatch++;
    } else {
        $myMissMatch++;
        $output .= "\n";
    }
    print $output;
}

print "You have " . $myMatch . " matches.\n";
print "You have " . $myMissMatch . " mismatches\n";
print "The ratio of hits to misses is " . $myMatch . ":" . $myMissMatch . ".\n";
@sequenceOne=(“A”、“T”、“C”、“G”、“T”、“A”、“C”);
@序列二=(“T”、“A”、“C”、“G”、“A”、“A”、“C”);
$myMatch=0;
$myMissMatch=0;
对于($i=0;$i<@sequenceOne;$i++){
my$output=“比较“$sequenceOne[$i]”.“$sequenceTwo[$i]”;
如果($sequenceOne[$i]eq$sequenceTwo[$i]){
$output.=“匹配\n”;
$myMatch++;
}否则{
$myMissMatch++;
$output.=“\n”;
}
打印$输出;
}
打印“您有”..$myMatch.“匹配项。\n”;
打印“您有”。$myMissMatch。“不匹配\n”;
打印“命中与未命中的比率为“$myMatch.”:“$myMissMatch.”。\n”;
当然,您可能希望动态地从其他内容读取序列,而不是对数组进行硬编码。但您明白了。使用上述代码,您的输出将是:

torgis-MacBook-Pro:platform-tools torgis$ ./dna.pl 
Comparing A <=> T
Comparing T <=> A
Comparing C <=> C MATCH
Comparing G <=> G MATCH
Comparing T <=> A
Comparing A <=> A MATCH
Comparing C <=> C MATCH
You have 4 matches.
You have 3 mismatches
The ratio of hits to misses is 4:3.
torgis MacBook Pro:平台工具torgis$./dna.pl
比较T
比较T
比较C-C匹配
比较G-G匹配
比较T
比较一场比赛
比较C-C匹配
你有4场比赛。
你有3个不匹配
命中与未命中的比率为4:3。

有很多方法可以做到这一点。这里有一种

use strict;
use warnings;

my $seq1 = "ATCGTAC";
my $seq2 = "TACGAAC";

my $len = length $seq1;
my $matches = 0;

for my $i (0..$len-1) {
    $matches++ if substr($seq1, $i, 1) eq substr($seq2, $i, 1);
}

printf "Length: %d  Matches: %d  Ratio: %5.3f\n", $len, $matches, $matches/$len;

exit 0;

我认为
substr
是一种方法,而不是将字符串拆分为数组

如果以子程序的形式呈现,这可能是最方便的:

use strict;
use warnings;

print ratio(qw/ ATCGTAC TACGAAC /);

sub ratio {

  my ($aa, $bb) = @_;
  my $total = length $aa;
  my $matches = 0;
  for (0 .. $total-1) {
    $matches++ if substr($aa, $_, 1) eq substr($bb, $_, 1);
  }

  $matches / ($total - $matches);
}
输出

1.33333333333333

Bill Ruppert说得对,有很多方法可以做到这一点。下面是另一个:

use Modern::Perl;

say compDNAseq( 'ATCGTAC', 'TACGAAC' );

sub compDNAseq {
    my $total = my $i = 0;
    $total += substr( $_[1], $i++, 1 ) eq $1 while $_[0] =~ /(.)/g;
    sprintf '%.2f', $total / ( $i - $total );
}
输出:

1.33

这里有一种方法,它为
xor
比较中的每个匹配提供一个空值,\0

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

my $d1='ATCGTAC'; 
my $d2='TACGAAC'; 

my $len = length $d1; # assumes $d1 and $d2 are the same length

my $matches = () = ($d1 ^ $d2) =~ /\0/g;

printf "ratio of %f", $matches / ($len - $matches);

输出:比率为1.333333,不是吗,哎呀。非常感谢你,伙计。我已经做了一段时间了。我还可以问一下,我如何计算结果的比率???@Conor-c,这取决于你所说的比率。通常x/y=x与y的比率。你是说百分比吗?