$ EXITVAL无法在perl中使用捕获功能

时间:2018-09-21 22:23:43

标签: perl

我需要从Perl脚本运行Perl脚本,将输出保存在日志文件中,如果遇到错误,则显示错误消息。我不希望脚本结束,只显示呼叫失败的消息。我正在使用捕获来执行此操作,但无法有条件地打印错误消息。

我提到了this link,尤其是这段文字:

  

$ EXITVAL IPC :: System :: Simple执行的任何命令的退出值   总是可以从$ IPC :: System :: Simple :: EXITVAL中检索   变量:

     

当检查捕获结果时,此功能特别有用,   从命令中返回捕获的文本。

     

使用IPC :: System :: Simple qw(捕获$ EXITVAL EXIT_ANY);我的   @enemies_defeated = capture(EXIT_ANY,“ defeat_evil”,“ / dev / mordor”);
  打印“程序退出,值$ 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 :(得分:2)

您可以使用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';
}

答案 1 :(得分:0)

与您不受支持的声明相反,它确实可以按照记录进行工作。

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.