Как пропустить строку / итерацию, если она выдает ошибку? - PullRequest
1 голос
/ 30 января 2012

Я использую Bio :: PopGen :: PopStats , чтобы вычислить F Райта st для каждой строки, которую я прочитал в моем входном файле.Мой входной файл содержит около 500 000 строк, поэтому я вычисляю эту статистику 500 000 раз следующим образом:

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

Я сохраняю каждое значение F st в массиве @fsts, потому что вконец Я использую все 500 000 Fsts для вычисления некоторой сводной статистики.

Если модуль не может рассчитать F st для одной из 500 000 строк, весь скрипт Perl останавливается и выдает сообщение об ошибкеобычно это:

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

Я бы хотел, чтобы моя программа выдала это сообщение об ошибке, но вместо остановки просто пропустите эту строку (ничего не помещайте в массив @fsts для этой строки) и завершитеостальные 500 000 строк.Есть предложения?

Ответы [ 2 ]

4 голосов
/ 30 января 2012

Вы можете использовать eval, чтобы перехватить фатальные ошибки:

my $fst;
eval {
    $fst = $stats->Fst(\@populations,\@markernames);
    push @fsts, $fst;
    1;
} or warn $@;
0 голосов
/ 30 января 2012

Используйте eval BLOCK:

my $fst = eval {
         $fst = $stats->Fst(\@populations,\@markernames)
         push(@fsts, $fst);
    } or {
         print $@;
    };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...