求大神看看这段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的部分出错,该怎么修改?
展开
 我来答
jianxia2k
2016-06-06 · TA获得超过399个赞
知道小有建树答主
回答量:365
采纳率:82%
帮助的人:199万
展开全部
my $id定义在上面的for循环内部,属于局部变量,所以出了那个循环就无效了。
从你程序看,好象是你的第二个循环里,应该少了一句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函数的写法。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式