Как заставить Perl-скрипты завершать работу, когда он запускается в циклах? - PullRequest
0 голосов
/ 07 января 2019

Я использую Perl для анализа своих данных исследований (несколько больших файлов, которые могут редактировать или изменять пользователи во время работы программы).

В моей программе есть сценарии, позволяющие проверить, завершен ли файл, или нет, прежде чем анализировать данные в одном из файлов. Эта проверка обрабатывается в несколько циклов. Если я просто использую «выход», это только выйти из цикла. Как заставить скрипты завершить работу и сгенерировать сообщение об ошибке для пользователя до его выхода? В моей программе есть определенная переменная, которая выводится в файл журнала в конце программы. Я НЕ хочу использовать команду GOTO. Любая дополнительная информация высоко ценится.

    ......
foreach $dir (@dirs)
{
   ...
   $file="$dir$filename";
   $file_size=`wc -l $file`;
   $line=`grep -n TIMESTEP $file`;

   #read the first line no of each frame in a data file
   @values=split(/\r?\n/,$line);
   $loop_i=0;
   $tmp=0;   #save line no for the first frame 
   foreach $sub_line (@values)
   {
     @sub_values=split(/:/,$sub_line);
     $line_no[$loop_i]=$sub_values[0];
     #check the line number in each frame same or not, if not quit
     if($loop_i==1){$tmp=$line_no[$loop_i]-$line_no[$loop_i-1];}
     elsif($loop_i>1)
     { $_=$line_no[$loop_i]-$line_no[$loop_i-1]; 
       if($_ <> $tmp) 
       {$flag=0; $err_message="$err_message; incomplete data (each frame has different line number)"; 
       exit;   #cannot quit the whole program 
       } 
     }
     else{;}
     $loop_i++;
   }#end foreach $sub_line (@values)
   .....
}#end foreach $dir (@dirs)

....

1 Ответ

0 голосов
/ 09 января 2019

Я думаю, что вы хотите, чтобы контроль цикла. Вы можете использовать next, last или redo для раннего выхода из цикла, полной остановки цикла или повторной обработки той же итерации. С помощью вложенных циклов вы можете использовать метку, чтобы указать, какой цикл вы хотите контролировать:

DIR: foreach my $dir ( ... ) {
    ...
    LINE: foreach my $line ( ... ) {
        next LINE if $skip_line;
        last LINE if ...;
        next DIR if ...;
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...