gpt4 book ai didi

perl - 如何从 OO Perl 中的子进程读取 STDOUT

转载 作者:行者123 更新时间:2023-12-01 02:04:28 26 4
gpt4 key购买 nike

在 Perl 中,读取子进程的 STDOUT 的一种方法是使用 open :

open(PIPE, "ls -l |");

不过,我一直在寻找一种更面向对象的方式来执行此操作,并且我一直在使用 IO::Pipe取得了一些成功。不过,我想检测错误,特别是如果命令不可执行。我不知道如何通过 IO::Pipe 做到这一点, 尽管。这是我所拥有的:
use strict;
use warnings;

use IO::Pipe;


my($cmd) = join (" ", @ARGV);

open(PIPE, "$cmd |") || die qq(error opening PIPE);
while (<PIPE>) {
chomp;
print "DBG1: $_\n";
}

close PIPE;

my($pipe) = IO::Pipe->new();
$pipe->reader($cmd);
die qq(error opening IO::Pipe) if $pipe->eof();

while (<$pipe>) {
chomp;
print "DBG2: $_\n";
}

$pipe->close();

如果子进程命令无效,两个检查都将正确 die .但是,如果子流程没有输出, eof()会报错,即使命令本身没问题:
$ perl pipe.pl "ls -l >/dev/null"
error opening IO::Pipe at pipe.pl line 20.

一堆问题,然后:

是否有合理的 OO 方式从 Perl 中的子进程中读取?是 IO::Pipe使用正确的工具?如果是这样,我如何检查以确保成功创建子流程命令?如果没有,我应该使用什么?我不想写子进程,所以我想我不想 IPC::Open2IPC::Open3 .如果可能的话,我更喜欢使用核心模块。

最佳答案

问题不在于 IO::Pipe。问题是eof是检查管道错误的错误方法。这并不意味着没有管道,这意味着没有任何东西可以从该管道中读取。 eof PIPE 也会有同样的问题。 .子流程不打印任何东西都很好。

如果您想检查子流程是否成功运行,事实证明 IO::Pipe 已经为您完成了该操作。

# IO::Pipe: Cannot exec: No such file or directory
$pipe->reader("hajlalglagl");

关于perl - 如何从 OO Perl 中的子进程读取 STDOUT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33638305/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com