- 论坛徽章:
- 0
|
open(FILE1, "<Test.fasta") || die("Cannot open file Test.fasta");
open(FILE2, "<Repeat.gff") || die("Cannot open file Repeat.gff");
open(OUTFILE, ">Test3.txt") || die("Cannot create file Test3.txt");
my %hash;
while(<FILE1>) {
chomp;
if(/^>/){
$key=substr($_,1);
}
else {
$hash{$key}.=$_;
}
}
while(<FILE2>){
chomp;
s/^\s+//g;
my @temp=split(/\t|\;/,$_);
my $ID=$temp[0]; # my $ID=substr($temp[0],0);
my $Start=$temp[3]-1;
my $Len=($temp[4]-$temp[3]+1);
while(my($key, $value)=each%hash){
if(exists $hash{$ID}) {
$hash{$ID} =~ s/^(.{$Start})(.{$Len})/$1.lc($2)/eg;
}
}
}
foreach my $k (keys %hash) {print OUTFILE "$k\t$hash{$k}";}
close FILE1;
close FILE2;
close OUTFILE;
这段脚本的执行结果是:Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.{ <-- HERE 32926})(.{195})/ at t41.pl line 27, <FILE2> line 60.
已知:GFF文件记录的是每个ID不同区段的序列特征信息,每个ID纵列出现若干次; fasta文件记录的是>ID\n 序列;
问题:首先读取序列fasta文件,存入hash数列,key指定为:“>”后面的字符串,以便于对应下面的GFF文件中的第一列$ID,便于在其中查找。$Start是要替换序列的起点,$Len是要替换序列从$Start开始的长度。$ID 是序列的ID, 对每一个ID,查找是否存在于fasta文件中,有对话,对其相应的序列坐标片段进行小写替换。然后输出结果。
本人刚刚开始写perl脚本,请问大神,我那里写错了????为什么运行报错,说正则表达式匹配超出范围,我查找了相应到Line27的序列,确认没有错误。SOS~~~~~ |
|