Как мне выполнить if-else в Perl Expect? - PullRequest
0 голосов
/ 26 июля 2010

Я использую Expect в Perl для выполнения одной задачи. После отправки команды я ожидаю либо Success, либо ERROR в качестве вывода, в зависимости от того, что мне нужно распечатать в файл, сообщив, что он был успешным или неудачным.

$exp->expect(30,
    '-re', "Success", printf LOG "Successfully Deleted \n" => sub {exp_last;},
    '-re', "ERROR",   printf LOG "Error in Deletion \n",
);

LOG - дескриптор файла. Если я использую это, то даже если я получу Success в качестве вывода команды send, оба регулярных выражения будут выполнены. В моем файле журнала я получаю

Error in Deletion
Successfully Deleted

Как мне решить эту проблему?

1 Ответ

3 голосов
/ 26 июля 2010

printf - оператор списка; первый printf сожрет все ожидаемые оставшиеся аргументы, как если бы вы сказали:

$exp->expect(30, '-re', "Success",
     printf( LOG "Successfully Deleted \n" =>
         sub {exp_last;},
         '-re',
         "ERROR",
         printf( LOG "Error in Deletion \n" )
     )
 );

Таким образом, в случае «Успех» сначала печатается «Ошибка при удалении», а затем «Успешно удалено». Вы, вероятно, должны иметь вместо:

$exp->expect(30,
    '-re', "Success", printf( LOG "Successfully Deleted \n" => sub {exp_last;} ),
    '-re', "ERROR",   printf( LOG "Error in Deletion \n" ),
);

за исключением того, что нет причин использовать printf вместо print.

ОБНОВЛЕНИЕ: Насколько я понимаю документы Expect, вы не делаете несколько шаблонов вообще, и вы должны это делать:

my $which_pattern = $exp->expect(30, "Success", "ERROR");
if ($which_pattern) {
    if ($which_pattern == 1) {
        print LOG "Successfully Deleted \n";
    }
    else {
        print LOG "Error in Deletion \n";
    }
}

Нет необходимости в -re, если вы не используете шаблоны вместо явных строк; Понятия не имею, чего вы пытались достичь с помощью бита sub {exp_last;}.

...