2012-01-30 90 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

相關問題