2014-02-15 27 views
0

我对Perl语言很陌生,遇到了一个我希望得到帮助的轻微问题。如何找到在两个或多个对齐的RNA序列中共价的位置(在Perl中)

我希望能够读取包含一组对齐的RNA序列的文本文件,并将每行按文本文件中的内容打印出来。例如:

gccuucgggc 
gacuucgguc 
ggcuucggcc 

然后我想在所有这些下面的序列中找到共变位置。在上面的例子中,前面和后面的第二个字符在每个序列中都是共变的。我想找到哪个位置以及哪条线变化并将其打印出来。

目前我能够在文本文件中的每一行打印出来如下:

open(RNAalign, $ARGV[0]) || "Can't open $ARGV[0]: $!\n"; 

while (<RNAalign>) { 
    $RNAseq .= $_; 
} 
print "$RNAseq\n"; 
@RNAseq=split('\n',$RNAseq); 

我不知道这是做正确的方式,但我希望我可以在这里得到一些帮助。感谢您提前提供任何帮助。

+0

[Levenshtein distance](http://en.wikipedia.org/wiki/Levenshtein_distance)? [Text :: Levenshtein](http://search.cpan.org/dist/Text-Levenshtein/Levenshtein.pm)将是我想的第一步。 – SparKot

+0

@quinshi,你好,你能提供你正在寻找的示例输出吗? – Gabs00

+1

您应该在程序中添加'use strict'和'使用warnings',使用'my'预先声明变量,并尝试使用带词法文件句柄的三参数'open'。从长远来看,所有这些都可以为您节省麻烦。有关一些解释,请参阅http://perlmaven.com/perl-tutorial。 – simbabque

回答

1

或许下面会有所帮助:

use strict; 
use warnings; 
use Data::Dumper; 

my (%hash, $stringNum, @covariances); 

while (<DATA>) { 
    chomp; 
    my $i = 0; 
    $stringNum++; 
    $hash{ $i++ }{ lc $_ } = 1 for split //; 
} 

for my $position (sort { $a <=> $b } keys %hash) { 
    push @covariances, $position if values %{ $hash{$position} } == $stringNum; 
} 

print Dumper \@covariances; 
print "\n", Dumper \%hash; 

__DATA__ 
gccuucgggc 
gacuucgguc 
ggcuucggcc 

输出:

$VAR1 = [ 
      '1', 
      '8' 
     ]; 

$VAR1 = { 
      '6' => { 
        'g' => 1 
       }, 
      '3' => { 
        'u' => 1 
       }, 
      '7' => { 
        'g' => 1 
       }, 
      '9' => { 
        'c' => 1 
       }, 
      '2' => { 
        'c' => 1 
       }, 
      '8' => { 
        'c' => 1, 
        'u' => 1, 
        'g' => 1 
       }, 
      '1' => { 
        'c' => 1, 
        'a' => 1, 
        'g' => 1 
       }, 
      '4' => { 
        'u' => 1 
       }, 
      '0' => { 
        'g' => 1 
       }, 
      '5' => { 
        'c' => 1 
       } 
     }; 

的脚本构建哈希,其中的键是字符串位置0 .. n的哈希值,以及相关的值是引用跟踪在这些位置跟踪角色的散列。如果给定位置中的所有字符串中的字符不同,则与键相关的值的数量将等于字符串的数量,表示协方差。请注意,@covariances包含1, 8。哈希被转储以便您可以看到数据结构。

该脚本跟踪字符串的数量,并将split的每个字符串转换为其字符,k将每个字符的键值保存在$i中。如果每个字符串中存在不同的字符(values %{ $hash{$position} } == $stringNum),for my $position (...段按数字顺序遍历关键字,并且push将关键字(字符串位置)重新写入@covariances

希望这会有所帮助!

相关问题