如何在两个或多个对齐的RNA序列中找到共变的位置(在Perl中)

时间:2014-02-15 17:20:53

标签: perl alignment sequences

我是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);

我不确定这是否是正确的方法,但我希望我能在这之后得到一些帮助。感谢您提前提供任何帮助。

1 个答案:

答案 0 :(得分: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中。 for my $position ( ...段按数字顺序遍历键,如果每个字符串中有不同的字符,则push将键(字符串位置)重复到@covariancesvalues %{ $hash{$position} } == $stringNum })。

希望这有帮助!