在perl中将几个变量合并在一起用于RNA比对

时间:2014-02-24 13:55:20

标签: perl merge alignment

我对齐的RNA序列是

gccuucgggc
gacuucgguc
ggcuucggcc

我已经完成了以下编码

    open(RNAalign, $ARGV[0]) || "Can't open $ARGV[0]: $!\n";
while ($line = <RNAalign>) {
    chomp ($line);
    push (@line, $line);
}

@covariences=();
foreach $i (@line) {
    foreach $j (@line) {
        unless ($i eq $j) {
            @search1=split("",$i);
            @search2=split("",$j);
            $k=0;
            while($k<scalar(@search1)) {
                if (@search1[$k] ne @search2[$k]) {
                $string="";
                $string="$k: @search1[$k] @search2[$k]\n";
                push (@covariences, $string);
                }
            $k++;
            }
        }
    }
}

打印时,这给了我:

1: c a
8: g u
1: c g
8: g c
1: a c
8: u g 
1: a g 
8: u c
1: g c
8: c g
1: g a
8: c u

我想要做的是合并所有相似的位置,同时保持他们可能拥有的任何不同的角色。如下(字符不必按照确切的顺序):

1: c a g
8: g u c

2 个答案:

答案 0 :(得分:0)

您可以创建哈希散列(HoH),其中键是位置,值是对哈希的引用,哈希的键是每个位置的字符。数据集的部分结构如下:

'8' => {
         'c' => 1,
         'u' => 1,
         'g' => 1
                 },
'1' => {
         'c' => 1,
         'a' => 1,
         'g' => 1
       },
'4' => {
        'u' => 1
       },

这是生成此HoH结构的代码:

use strict;
use warnings;

my ( %hash, $stringNum );

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

for my $position ( sort { $a <=> $b } keys %hash ) {
    if ( keys %{ $hash{$position} } == $stringNum ) {
        my @chars = keys %{ $hash{$position} };
        print "$position: @chars\n";
    }
}

__DATA__
gccuucgggc
gacuucgguc
ggcuucggcc

输出:

1: c a g
8: c u g

while循环中,计算字符串数,并将每个字符串split放入其字符中以创建HoH。在for循环中,如果键的数量(例如,“c”)等于总字符串的数量,则每个字符串在该位置处变化,因此位置和那些被打印为协方差的实例。

希望这有帮助!

答案 1 :(得分:0)

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

my $s = "gccuucgggc
gacuucgguc
ggcuucggcc";
print "$s\n\n";
my $data = [];
my @lines = split(/\n/,$s);
chomp(@lines);
my $row=0;
my $col=0;
foreach my $line (@lines){
   my @chars = split("",$line);
   $col = 0;
   foreach my $char (@chars){
     $data->[$row]->[$col] = $char;
     $col++;
   }
   $row++;   
}
#print Dumper($data,$col,$row);
for(my $i=$col-1;$i>=0;$i--){
    my $no_diff = 0;
    my $result='';my $prev='';
    #print "i: $i\n";
    for(my $j=$row-1;$j>=0;$j--){
        #print Dumper([$i,$j,$prev,$result,$data->[$j]->[$i]]);
        if ($prev eq $data->[$j]->[$i]){
            $no_diff++;         
        }
        $result .= $data->[$j]->[$i];
        $prev = $data->[$j]->[$i];  
    }
    print "$i: $result\n" if !$no_diff;
}