perl管道中的可编程参数

时间:2016-09-22 14:19:39

标签: perl pipe

我正在逐步推进perl学习曲线(感谢这个真正有用的网站的贡献者),但我正在努力解决这个问题。

我正在构建一个使用三个(c ++)第三方程序的perl实用程序。通常这些运行:A $ file_list | B -args | C $ file_out

其中进程A读取多个文件,进程B修改每个单独的文件,进程C收集管道中的所有输入文件并生成一个输出文件,其中一个空输入文件表示输入流的结束。

输入文件很大(ish)大约100Mb,大约10。这些进程是CPU密集型的,整个过程需要每天应用于数千个文件组,因此将中间文件读写到磁盘的简单解决方案效率太低。此外,上述过程只是处理序列的一部分,其中输入文件已经在内存中,输出文件也需要在内存中进行进一步处理。

有许多解决方案已经有详细记录,我有一个使用IPC :: Open3()的原型版本。到现在为止还挺好。 :)

然而 - 当通过进程B将每个文件传递给进程A 时,我需要为进程B修改每个输入文件中的参数,而不会中断进程C的正向流程。这是我无法阻止的地方我正在寻找一些建议。

作为进一步的背景:

  1. 在Ubuntu 16.04 LTS(目前在虚拟框中)和perl v5.22.1中运行
  2. 程序将由一个用户(我!)在一台机器上运行(并且在其中),即没有外部网络通信或多用户或公共要求 - 因此编程的简单性优于强安全性。
  3. 由于该过程必须不间断地重复运行,因此需要强大/可靠的I / O处理。
  4. 我可以访问每个进程的源代码,因此可以修改(虽然我不愿意)。
  5. 我对缺乏“迄今为止的代码”感到抱歉,但我认为问题更多的是“我该如何解决这个问题?”而不是“我如何让我的代码工作?”。

    非常感谢任何指针或帮助。

2 个答案:

答案 0 :(得分:2)

你需要第四个程序(称之为D)来确定B的参数应该是什么,并用这些参数执行B并且将D的stdin和stdout连接到B的stdin和stdout。然后,您可以在管道中用D替换B.

您使用D语言取决于您。

答案 1 :(得分:2)

如果您希望将不同程序的输出提供给管道,我建议您要查看的内容是......好吧,pipe

这可以让你设置一个管道 - 它与你从IPC::Open3获得的管道非常相似,但可以更好地控制你读/写的内容。