Как выполнить действие при ошибке «Нет такого файла или каталога»

#perl

#perl

Вопрос:

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

 my $command = "find ". $folderName." -type f ".$mtimeOption." -exec rm '{}' \;"; 
execLinuxCommand($command);
  

ExecLinuxCommand добавляет ошибки в @errors .

 my ($stdout, $stderr) = capture {
    system ($command);
};  

if ($stderr) {
    $stderr =~ s/s $//;
    $ic->log(domain=>"lifecycle",level=>"error",message=>"ERROR: $stderr", evalcontext=>$ic);
    push @errors, { command => $command, error => $stderr, level=> "ERROR" };               
}
  

Тогда есть processCommandsErrors

 sub processCommandsErrors {

 my ($ic) = @_;

 if (@errors) {
    my $errorMessage = "There were " . ($#errors   1) . " errors during cleanup task:n";

    for my $i ( 0 .. $#errors ) { 
        $errorMessage .= ($i   1) . ". $errors[$i]{level}:n"; 
                    
        $errorMessage .= "tCommand: $errors[$i]{command}n"; 
        $errorMessage .= "tError: $errors[$i]{error}n"; 
    }
            
    die($errorMessage);
 }
}
  

Что я хочу сделать, так это умереть при любой другой ошибке, кроме No such file or directory error. Для этой ошибки я бы хотел только зарегистрировать, что файл / папка не существует.

Теперь вопрос: существует ли более элегантный способ обнаружения No such file or directory ошибки в ‘processCommandsErrors’, чем:

 $errors[$i]{error} == 'No such file or directory'
  

Комментарии:

1. Не связано: для последней части вашего find , -exec rm '{}' ; вы можете вместо этого проверить опцию -delete .

2. Почему бы вместо этого не использовать File::Find(::Rule) и unlink ? Тогда нет необходимости играть с оболочкой и фиксировать стандартный вывод / STDERR.

3. Добавьте быстрый тест для существующего каталога — если это так, внесите залог, еще войдите и продолжайте.

4. Нет никаких причин использовать команду оболочки в программе Perl для выполнения задач, которые может выполнять Perl, а затем пытаться заново создавать отчеты об ошибках в Perl. Используйте File::Find вместо этого.

Ответ №1:

Как упоминалось в этом URL, вы можете вместо этого проверить errno :

 errno -ls
...
ENOENT 2 No such file or directory
...
  

Это выглядит более элегантно, чем проверка всей строки на самом деле.

Ответ №2:

  $errors[$i]{error} == 'No such file or directory'
  

На самом деле это не работает. Он выдаст предупреждение. Сравнение строк необходимо eq , а не == . Вероятно, вам все равно нужно соответствие шаблону, потому что сообщение может содержать дополнительную информацию или разрыв строки.

Комментарии:

1. да, вы правы, я использовал индекс вместо этого. я имел в виду, что если существует что-то вроде номера ошибки… или что-то еще