加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:16:03 所属栏目:大数据 来源:网络整理
导读:在Perl中,读取子进程的STDOUT的一种方法是使用open: open(PIPE,"ls -l |"); 我正在寻找一种更加面向对象的方法来做到这一点,而且我一直在使用IO :: Pipe取得了一些成功.我想检测错误,特别是如果命令不可执行.不过,我无法弄清楚如何通过IO :: Pipe来做到这一
在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();

如果子进程命令无效,则两个检查都将正确死亡.但是,如果子进程没有产生输出,eof()将报告错误,即使命令本身很好:

$perl pipe.pl "ls -l >/dev/null"
error opening IO::Pipe at pipe.pl line 20.

一堆问题,然后:

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

解决方法

问题不是IO :: Pipe.问题是eof是检查管道错误的错误方法.这并不意味着没有管道,这意味着没有什么可以从管道中读取.你对eof PIPE也有同样的问题.子流程不打印任何东西都是完美的.

如果你想检查子流程是否成功运行,那么事实证明IO :: Pipe已经为你做了.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读