我需要从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。
我有什么想念的吗?还有其他方法可以完成我想做的事情吗?
答案 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.