$ EXITVAL не работает с захватом в Perl - PullRequest
0 голосов
/ 22 сентября 2018

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

Я сослался на эту ссылку , особенно этот текст:

$EXITVAL Выходное значение любой команды, выполняемой IPC :: System :: Simple, всегда можно получить из переменной $ IPC :: System :: Simple :: EXITVAL:

Это особенно полезно при проверке результатов захвата, который возвращает захваченный текст из команды.

use IPC :: System :: Simple qw (capture $ EXITVAL EXIT_ANY);my @enemies_defeated = capture (EXIT_ANY, "defeat_evil", "/ dev / mordor");
print "Программа вышла со значением $ EXITVAL \ n";

$ EXITVAL будет установлена ​​в-1, если команда не завершилась нормально (например, завершилась сигналом) или не запустилась.В этом случае также будет сгенерировано исключение.

Это мой код:

use IPC::System::Simple qw(capture EXIT_ANY $EXITVAL);
my $output = capture(EXIT_ANY, $tool_path);
if($EXITVAL == -1){
        print "CHECK_FLOW: Error! check. Check the log file mem_check.log\n";
}
else{
        print "CHECK_FLOW: Completed check.\n";
}
my $filename = 'check.log';
open(my $fh, '>', $filename);
print $fh "$output\n";
close $fh;

Я специально вставил ошибку в $ tool_path и использовал отладчик, который показывает$ EXITVAL будет 0 в обоих случаях.

Есть ли что-то, чего мне не хватает?Есть ли другой способ выполнить то, что я пытаюсь сделать?

Ответы [ 2 ]

0 голосов
/ 22 сентября 2018

Вопреки вашим неподдерживаемым утверждениям, он работает как задокументировано.

use strict;
use warnings qw( all );

use IPC::System::Simple qw( capture EXIT_ANY $EXITVAL );

{
   my $output = capture(EXIT_ANY, 'perl', '-e', 'print "abc\n"; exit(123);');
   print("<$_>\n") for split /\n/, $output;
   print("$EXITVAL\n");
}

print("--\n");

{
   my $output = capture(EXIT_ANY, 'non-existent');
   print("<$_>\n") for split /\n/, $output;
   print("$EXITVAL\n");
}

Вывод:

<abc>
123
--
"non-existent" failed to start: "No such file or directory" at a.pl line 15.
0 голосов
/ 22 сентября 2018

Вы можете использовать Capture :: Tiny , чтобы сделать это.Ваш вариант использования фактически является первым в кратком изложении документов.

use strict;
use warnings;
use Capture::Tiny;

my ($stdout, $stderr, $exit) = capture {
  system( './foo.pl', @args );
};

if ($exit) {
    warn 'something went wrong when executing foo.pl';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...