如何从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"); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |