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

时间:2013-05-02 07:17:17

标签: perl ipc

是否有内置的perl函数,或者存在如下所示的库:

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

哪个外部命令从IN_FILEHANDLE读取,写入OUT_FILEHANLE,stderr转到ERR_FILEHANDLE。

e.g。

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是否符合我的要求,所以我只是在寻找一种可以构建的可行解决方案。

1 个答案:

答案 0 :(得分:0)

我会:

  1. 将STD *重定向到所需的FH。
  2. 执行system($cmd);
  3. 将STD *恢复到原始状态。
  4. 详细了解 Hari的示例:

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

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