我是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 :(得分: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
将键(字符串位置)重复到@covariances
(values %{ $hash{$position} } == $stringNum
})。
希望这有帮助!