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

Posted

技术标签:

【中文标题】Perl 使用自定义文件句柄打开外部命令【英文标题】:Perl open external command with custom filehandles 【发布时间】:2013-05-02 07:17:17 【问题描述】:

是否有 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 是否能做我想做的事,所以我只是在寻找可以构建的可行解决方案。

【问题讨论】:

你为什么不显示你正在使用的代码 run3 并准确解释什么不起作用? 你把\n放在Input to command的末尾吗? 是的。已编辑。我的代码中实际上有很多行输入。就像我说的,一个可行的例子会很有帮助。 【参考方案1】:

我愿意:

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

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

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

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

【讨论】:

你能举个例子说明这如何让我像使用 open($fh, "|$cmd") 一样直接将print 输入到$cmds 输入?

以上是关于Perl 使用自定义文件句柄打开外部命令的主要内容,如果未能解决你的问题,请参考以下文章

HBuilderX自定义外部命令 - 右键复制文件相对路径/绝对路径

'perl' 不是内部或外部命令,也不是可运行的程序

delphi获取窗体的句柄

命令提示符总是提示不是内部外部命令

mysqldumpslow不是内部或外部命令,也不是可运行的程序

安装perl for win32 是用cmd的cd指令结果显示"perl"不是内部或外部命令,也不是可运行的程序或批处理文件。