以下是fasta fileA的内容:
>1
PLAARRPRRGKSLAGFESLACSFPVVSRGFLASRSARSLSSEGGTMPDNRQ
PRNRQPRIRSGNEPRSAPAMEPDGRGAWAHSRAALDRLEKLLRCSRCTNIL
REPVCLGGCEHIFCSNCVSDCIGTGCPVCYTPAWIQDLKINRQLDSMIQL
>2
PLWRPAVPDAGRARPVWSRWSAASLWFLKASLLPALRGAFHPKAGRCRIIGS
RGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF*E
SLCV*EDVSTSSVVIV*VTALELDVQCVTPRPGYKT*R*ID
>3
TPPLWRPAVPDAGRAWPVSSRWPAASRWFPEASLLPALRGAFHPKAGRCRII
GSRGTGSRGSAPGTSLVPRPPWNRMVAVPGPTVAPRSTAWRSCCAARVVLTF
现在我需要将fileA作为输入,找出1和2之间存在的错配,然后是1-3,并找出它们之间的核苷酸变化。到目前为止我编写了一个程序,但它没有将fileA作为输入。请帮助
我的问题是我需要将fileA作为输入,并且序列在每51个核苷酸之后包含新行字符,并且我的程序也会考虑新行字符以找出不匹配。
的程序: 的
$a=<>;$b=<>;
@mul=("$a","$b");
for($i=0;$i<scalar(@mul)-1;$i++) {
$source=$mul[$i];
print "\n\nComparision of source: $mul[$i]\n";
print "------------------------------------";
for($j=$i+1;$j<scalar(@mul);$j++) {
$sample=$mul[$j];
print "\n$sample ";
print "\n------\n";
$t=mutate($source,$sample);
print $t;
}
}
sub mutate {
my ($s1,$s2)=@_;
$temp="";
for($k=0;$k<length($s1);$k++) {
$seq1=substr($s1,$k,1);
$seq2=substr($s2,$k,1);
if($seq1 ne $seq2) {
$temp.="[$seq1($k)/$seq2($k)]";
}
}
return $temp;
}
答案 0 :(得分:1)
您可能希望阅读段落,这些段落由一行中的两个换行符标记。因此:
use strict;
use warnings;
my(@a);
{
# Limit the scope in which you reset the $/ variable
local($/) = "\n\n";
while (<>)
{
s/\n+//gm; # Remove all newlines
push @a, $_;
}
}
# Now your array contains three items with no newlines - process away...
答案 1 :(得分:0)
如果我正确理解了您的问题,那么您可以从命令行中读取文件,以便获得不同文件的结果。 在这里我们读取每一行并获取源编号,然后在chomp之后,将每一行附加到相应的源。然后你可以将任何一行与任何源内容进行比较。
my $file = $ARGV[0];
open (FILE, $file);
my $file_content;
my $src_indx = 0;
while (my $line = <FILE>){
chomp $line;
$line =~ s/^\s+//;
if ($line =~ /^\>(\d+)/){
$file_content->{$1} = '';
$src_indx = $1;
}else{
$file_content->{$src_indx} .= $line;
}
}
print "\n\nComparision of source: 1 and 2\n";
print "------------------------------------\n";
$t = mutate($file_content->{1},$file_content->{2});
print $t;
sub mutate {
my ($s1,$s2)=@_;
$temp="";
for($k=0;$k<length($s1);$k++) {
$seq1=substr($s1,$k,1);
$seq2=substr($s2,$k,1);
if($seq1 ne $seq2) {
$temp.="[$seq1($k)/$seq2($k)]";
}
}
return $temp;
}
我没有修改你的mutate函数。如果你使用正则表达式或split而不是substr,你也可以更好地控制mutate。
如果这不是你想要的,请告诉我。