求大神看看这段perl脚本出错的原因。
小白一个,需要用这个脚本处理数据。先把文件中小于200长度的序列删除,然后再从中抽取3000条序列数据为输出文件1,剩下的数据为输出文件2.如下:#!/usr/bin/p...
小白一个,需要用这个脚本处理数据。先把文件中小于200长度的序列删除,然后再从中抽取3000条序列数据为输出文件1,剩下的数据为输出文件2.如下:
#!/usr/bin/perl
use strict;
use warnings;
## perl *.fa cds3k.fa cdsleft.fa
my $file=$ARGV[0]; ## input file
my $file1=$ARGV[1]; ## output file1
my $file2=$ARGV[2]; ## output file2
open (OUT1,">$file") || die "Can not open the $file1 file!\n";
open (OUT2,">$file") || die "Can not open the $file2 file!\n";
my $N=3000; ## the number of random sequence
my %H=&getfasta($file);
my @ar=keys %H;
## filtering
foreach my $i (@ar) {
if ($H{$i}<=200) {
delete $H{$i};
}
}
## print the number of random sequence
@ar=keys %H;
my @br=();
for (my $i=0;$i<=$#ar ;$i++) {
push @br, int(rand(scalar(@ar)));
}
@br=&unique(@br);
for (my $i=0;$i< $N;$i++) {
my $id=$br[$i];
print OUT1 ">$id\n";
print OUT1 "$H{$id}\n";
delete $H{$id};
}
## print the left sequence
foreach my $i (keys %H) {
print OUT2 ">$id\n";
print OUT2 "$H{$id}\n";
}
close(OUT1);
close(OUT2);
运行结果显示:
Global symbol "$id" requires explicit package name at clean_fasta.pl line 42.
Global symbol "$id" requires explicit package name at clean_fasta.pl line 43.
Execution of clean_fasta.pl aborted due to compilation errors.
输出文件2的部分出错,该怎么修改? 展开
#!/usr/bin/perl
use strict;
use warnings;
## perl *.fa cds3k.fa cdsleft.fa
my $file=$ARGV[0]; ## input file
my $file1=$ARGV[1]; ## output file1
my $file2=$ARGV[2]; ## output file2
open (OUT1,">$file") || die "Can not open the $file1 file!\n";
open (OUT2,">$file") || die "Can not open the $file2 file!\n";
my $N=3000; ## the number of random sequence
my %H=&getfasta($file);
my @ar=keys %H;
## filtering
foreach my $i (@ar) {
if ($H{$i}<=200) {
delete $H{$i};
}
}
## print the number of random sequence
@ar=keys %H;
my @br=();
for (my $i=0;$i<=$#ar ;$i++) {
push @br, int(rand(scalar(@ar)));
}
@br=&unique(@br);
for (my $i=0;$i< $N;$i++) {
my $id=$br[$i];
print OUT1 ">$id\n";
print OUT1 "$H{$id}\n";
delete $H{$id};
}
## print the left sequence
foreach my $i (keys %H) {
print OUT2 ">$id\n";
print OUT2 "$H{$id}\n";
}
close(OUT1);
close(OUT2);
运行结果显示:
Global symbol "$id" requires explicit package name at clean_fasta.pl line 42.
Global symbol "$id" requires explicit package name at clean_fasta.pl line 43.
Execution of clean_fasta.pl aborted due to compilation errors.
输出文件2的部分出错,该怎么修改? 展开
1个回答
展开全部
my $id定义在上面的for循环内部,属于局部变量,所以出了那个循环就无效了。
从你程序看,好象是你的第二个循环里,应该少了一句my $id=$H{$i};
从你程序看,好象是你的第二个循环里,应该少了一句my $id=$H{$i};
追问
加上之后,运行还是错误。然后我把foreach my $i (keys %H) {改成了foreach my $id (keys %H) {
结果输出1的循环有错:Use of uninitialized value $id;Use of uninitialized value $id;Use of uninitialized value within %H
追答
你这个报错,是说使用了未初始化的变量,也就是%H没有值。看程序, %H的赋值是调用了函数getfasta,而你这个程序不全,没有getfasta函数的写法。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询