如何通过管道打开程序并将输出存储到Perl中的变量中?

时间:2017-06-02 02:36:14

标签: perl pipe backticks

我有两列数据。如何获得每列的最小值和最大值?

我尝试过类似的事情:

open $in, "|gmt minmax -C";
print $in ...;
...
close($in);

但是,输出将打印到屏幕上。如何将结果存储在@minmax中(使用反引号?)

1 个答案:

答案 0 :(得分:2)

有很多方法可以解决这个问题。

  1. 使用模块。
  2. 有许多模块能够以比自己动手更简单的方式为您处理管道。 IPC::RunIPC::Run3或我当前最喜欢的AnyEvent::Util :: run_cmd。这只是最小的抽样 - 在CPAN中四处看看,我相信你会发现更多。其中一些可以将输出定向到标量中,有些还允许您在输入时处理输入,这在您可能长时间接收大量输入时可能是有利的,并且可以在通过时过滤它只提取您感兴趣的数据部分。

    1. 自己使用pipe
    2. 这是一些模块的功能。创建一对双向管道,fork,关闭各自进程中不需要的管道末端,将正确的管道连接到stdout和stdin,并执行子进程。把它做好是很棘手的,因此是模块的原因。

      1. 自己找出最小值和最大值。
      2. 您的进程空间中已有数据(或者您有文件),只需将其读入一对数组,然后在阵列上调用List::Util::minList::Util::max。 (我假设他们是简单的数字 - 如果他们以某种形式复杂化,你可能必须实现自己的最小/最大数量。)

        1. 将数据视为数据。
        2. 如果您的数据是结构化的,我最喜欢的一个就是将其输入DBD::CSV然后我可以在其上执行SQL - 您甚至可以直接从内存中提供数据,如果这样做的话你有什么。它在运行时有点慢,但可以做一些非常有用的事情。这也是将数据放入真实(或真实)数据库的好方法,无论SQLite是否作为中间体(这绝不是我的最终计划,但它是一个伟大的开发工具或证明 - - 可能多年来可行的概念),或者mySQL,postgres,DB2,Oracle,等等,特别是如果你的数据集继续增长。