2012-01-30 89 views
1

我使用Bio::PopGen::PopStats来计算Wright's Fst我在输入文件中读取的每一行。我的输入文件包括大约500,000的线条,所以我计算该统计500,000次,如下所示:如果产生错误,我该如何跳过一行/迭代?

use Bio::PopGen::PopStats; 
my $stats = Bio::PopGen::PopStats->new(); 
my $fst = $stats->Fst(\@populations,\@markernames); 
push(@fsts, $fst); 

我阵列@fsts在保存各f ST值,因为在我使用所有500000 FSTS计算结束一些汇总统计。

如果模块不能计算在F ST为50万线,整个Perl脚本停止之一,并给出错误信息,通常这一个:

Illegal division by zero at /usr/share/perl5/Bio/PopGen/PopStats.pm line 292, <READ2> line 10878. 

,我想我的程序给出这个错误信息,但不是停止,而是跳过这一行(在@fsts阵列中没有为这行写入任何内容),并完成500,000行的其余部分。有什么建议么?

回答

4

您可以使用eval捕获致命错误:

my $fst; 
eval { 
    $fst = $stats->Fst(\@populations,\@markernames); 
    push @fsts, $fst; 
    1; 
} or warn [email protected]; 
+1

'的eval {...; 1}或警告$ @'是使用eval的更安全的方法。在失败的eval后,'$ @'应该是真的,但是有一些情况不会发生。但是一个失败的eval将总是返回false,所以如果你在成功时返回true,那么eval就会变成一个布尔值,并且它的状态。 – 2012-01-30 14:01:39

+0

@Eric:你能提供一个这样的案例吗? – 2012-01-30 14:10:13

+0

参见http://use.perl.org/~grantm/journal/38375。我会继续编辑它。 – daxim 2012-01-30 15:01:49

-1

使用的eval BLOCK

my $fst = eval { 
     $fst = $stats->Fst(\@populations,\@markernames) 
     push(@fsts, $fst); 
    } or { 
     print [email protected]; 
    }; 
+0

你没有正确推动结果。 – Qtax 2012-01-30 13:47:11

+0

@ Qtax:是的,你是对的,现在修好了。 – 2012-01-30 13:56:43

+0

仍然是同样的问题。 '$ fst'在它被分配之前被推送。 – Qtax 2012-01-30 14:08:46

相关问题