#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. да, вы правы, я использовал индекс вместо этого. я имел в виду, что если существует что-то вроде номера ошибки… или что-то еще