1

是否有 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但我似乎无法让他们工作。工作示例(也许用 say 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做我想要的,所以我只是在寻找一个我可以建立的可行解决方案。

4

1 回答 1

0

我会:

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

查看Hari 的示例以了解详细方法:

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

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

于 2013-05-02T12:44:19.750 回答