Perl中打开自定义文件句柄外部命令

问题描述:

是否有一个Perl的功能,无论是内置的,或者是像下面这样的库:Perl中打开自定义文件句柄外部命令

run(IN_FILEHANDLE, OUT_FILEHANDLE, ERR_FILEHANDLE, $cmd); 

它获取外部命令从IN_FILEHANDLE读,写OUT_FILEHANLE与stderr去ERR_FILEHANDLE。

例如

run(STDIN, STDOUT, STDERR, $cmd); 

将类似于:

system($cmd); 

和:

run(IN, OUT, ERR, $cmd); 

会有点像一个不存在的版本:

open(IN, OUT, ERR, "|$cmd|"); 

我发现open($fh, "|$cmd"); ,和open($fh, "$cmd|");易于使用,我只是从文件句柄读取/写入。我只想要一种能够同时工作的方法。

如果还可以选择读取/写入标量,则可以获得奖励积分。

我一直在open3IPC::Run四处寻找,但我似乎无法让他们工作。工作示例(可能与例如grep),将不胜感激。

编辑:在回应评论,我当前的代码:

open3($stdin_fh, $stdout_fh, $stderr_fh, $refresh_exec); #1 
print "Opened"; #2 
print $stdin_fh "Input to command\n"; #3 

似乎达成线#2

,并使用IPC::Run前悬挂:

start \@cmd_arr, $stdin_fh, $stdout_fh, $stderr_fh; 
print "Opened"; #2 
print $stdin_fh "Input to command\n"; #3 

运行命令但写道给出了错误:Can't use an undefined value as a symbol reference

我知道我的代码不完整,但我不想粘贴400行代码,如果我可以成功地将其剪下并隔离问题,我不需要问这个问题。

我甚至不确定是否open3IPC::Run做我想做的,所以我只是寻找一个我可以建立的工作解决方案。

+2

你为什么不用'run3'显示你正在使用的代码,并解释到底哪些工作不工作? – Mat 2013-05-02 07:19:38

+0

更多详细信息已添加。 – Clinton 2013-05-02 07:32:48

+0

你在'输入到命令'的末尾放了'\ n'吗? – Barmar 2013-05-02 07:45:38

我想:

  1. 重定向STD *所需FH的。
  2. 执行system($cmd);
  3. 将STD *恢复到原始状态。

看一看哈日的例如,对于详细的方法:

https://*.com/a/1720592/1485996

您也可以使用local避免恢复STD。

+0

你能举一个例子,说明如何让我直接将'print'打印到像'open($ fh,“| $ cmd”)''那样的'cmd'输入中? – Clinton 2013-05-02 14:41:27