我对齐的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
答案 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;
}