3

通过 Perl 中的open命令,您可以使用文件句柄。但是,我无法使用 Perl 中的 open 命令取回退出代码。

使用 Perl 中的system命令,我可以取回正在运行的程序的退出代码。但是我只想将 STDOUT 重定向到某个文件句柄(没有标准错误)。

我的标准输出将是键值对的逐行输出,我想将其插入到 perl 中的 mao 中。这就是为什么我只想从 perl 中的 Java 程序重定向我的标准输出。那可能吗?

注意:如果我收到错误,错误会打印到 stderr。一种可能性是检查是否有任何内容打印到 stderr,以便我可以完全使用 Perl 脚本。

4

4 回答 4

3

您可能想查看IPC::System::Simple ——它为您提供了许多用于执行外部命令、捕获其输出和返回值以及在返回错误结果时可选地死亡的选项。

于 2010-04-27T16:12:14.943 回答
3

典型地,如果您试图获取分叉进程的文本输出,我的理解是这就是反引号的用途。如果您还需要退出状态,您可以在$?之后使用特殊变量检查它,例如:

open my $fh, '>', "output.txt" or die $!;
print {$fh} `echo "Hello!"`;
print "Return code: $?\n";

从反引号命令到 STDERR 的输出不会被捕获,而是会直接写入调用它的 Perl 程序中的 STDERR。

于 2010-04-27T20:41:11.803 回答
1

open-|模式下使用。当您close使用文件句柄时,退出状态将为$?.

open my $fh, '-|', "$command";  # older version:  open my $fh, "$command |";
my @command_output = <$fh>;
close $fh;
my $command_status = $?;

perldoc -f close

如果文件句柄来自管道打开,"close"如果涉及的其他系统调用之一失败,或者程序以非零状态退出,则将另外返回 false。(如果唯一的问题是程序退出非零,$! 将设置为 0。)关闭管道还等待在管道上执行的进程完成,以防您想在之后查看管道的输出,并隐式将该命令的退出状态值放入$?and "${^CHILD_ERROR_NATIVE}"

于 2010-04-27T14:08:28.350 回答
1

这是做到这一点的方法之一。

open my $fh, '>', $file;
defined(my $pid = fork) or die "fork: $!";
if (!$pid) {
    open STDOUT, '>&', $fh;
    exec($command, @args);
}
waitpid $pid, 0;
print $? == 0 ? "ok\n" : "nok\n";
于 2010-04-27T10:33:42.443 回答