【问题标题】:What's the differences between system and backticks and pipes in Perl?Perl 中系统与反引号和管道之间有什么区别?
【发布时间】:2010-10-22 06:42:36
【问题描述】:

Perl 支持三种运行外部程序的方式(据我所知):

system:

   system PROGRAM LIST

如:

system "abc";

反引号如:

`abc`;

通过管道运行它,如下所示:

open ABC, "abc|";

它们之间有什么区别?以下是我所知道的:

  1. 您可以使用反引号和管道轻松获取命令的输出。
  2. 就是这样(在以后的编辑中更多?)

【问题讨论】:

    标签: perl system pipe backticks


    【解决方案1】:
    • system():运行命令并返回命令的退出状态
    • 反引号:运行命令并返回命令的输出
    • 管道:运行命令并允许您将它们用作句柄

    同时反引号将执行程序的 STDOUT 重定向到一个变量,系统将它发送到你的主程序的 STDOUT。

    【讨论】:

    • 管道是一种更细粒度的反引号控制。反引号返回 STDOUT,如:$date = date。使用管道,您可以决定何时以及如何读取输出,或向进程发送信号。
    【解决方案2】:

    perlipc 文档解释了您可以通过 Perl 与其他进程交互的各种方式,perlfunc's open documentation 解释了管道文件句柄。

    • 系统将其输出发送到标准输出(和错误)
    • 反引号捕获标准输出并将其返回(但不是标准错误)
    • 管道打开允许您捕获输出并从文件句柄中读取它,或者打印到文件句柄并将其用作外部命令的输入。

    还有一些模块可以处理跨平台边缘案例的这些细节。

    【讨论】:

      【解决方案3】:

      系统还返回应用程序的退出值(Windows 中的 ERRORLEVEL)。 管道使用起来有点复杂,因为从它们中读取并关闭它们会添加额外的代码。 最后,他们有不同的实现,这意味着做不同的事情。使用管道,您可以与已执行的应用程序进行通信,而其他命令则不允许这样做(很容易)。

      【讨论】:

        【解决方案4】:

        获取程序退出状态不限于system()。当你调用close(PIPE)时,它会返回退出状态,你可以从$?获取所有3个方法的最新退出状态。

        另请注意

        readpipe('...')
        

        相同
        `...`
        

        【讨论】:

        • 你能完成这句话吗?另请注意 readpipe('...') 而不是 ... 。
        • 我修复了格式以使其更清晰。使用反引号表示固定类型使得键入 real 反引号... 变得困难
        • 进一步说明,... 和 qx/.../(以及 qx(...) 和 qx#...# 以及任何其他分隔符)也是等价的。
        猜你喜欢
        • 2010-10-22
        • 2010-10-30
        • 2021-04-29
        • 2011-01-29
        • 2014-01-21
        • 2018-04-05
        • 1970-01-01
        相关资源
        最近更新 更多