在Perl中,system、反引号和管道有何不同?

29

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

system

   system PROGRAM LIST

如下:

system "abc";

反引号的使用方法如下:

`abc`;

将其通过管道运行,例如:

open ABC, "abc|";

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

  1. 您可以使用反引号和管道轻松获取命令的输出。
  2. 就这样(将来的编辑中可能会有更多?)
4个回答

36
  • system():运行命令并返回命令的退出状态
  • 反引号:运行命令并返回命令的输出结果
  • 管道:运行命令并允许您将其用作句柄

另外,反引号将执行程序的STDOUT重定向到变量中,而system则将其发送到主程序的STDOUT。


管道是比反引号更细粒度的控制。反引号返回STDOUT,例如:$date = date。使用管道,您可以决定何时以及如何读取输出,或向进程发送信号。 - Mathieu Longtin

3

Perlipc文档介绍了Perl与其他进程交互的各种方式,而perlfunc的open文档则介绍了管道文件句柄。

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

还有一些模块处理这些细节以处理跨平台边缘情况。


2

系统还返回应用程序的退出值(在Windows中为ERRORLEVEL)。 使用管道有些复杂,因为读取和关闭它们需要额外的代码。 最后,它们有不同的实现,旨在完成不同的任务。使用管道,您可以与执行的应用程序进行双向通信,而其他命令则不允许这样做(容易)。


1
获取程序的退出状态不仅限于system()。当您调用close(PIPE)时,它会返回退出状态,并且您可以从$?获取所有3种方法的最新退出状态。
请注意:
readpipe('...')

等同于

`...`

你能完成这个句子吗?请注意使用readpipe('...')而不是...。 - Nathan Fellman
我修复了格式以使其更清晰。使用反引号来表示固定类型会使输入真正的反引号变得困难... - ephemient
进一步说明,... 和 qx/.../(以及 qx(...)、qx#...# 和任何其他分隔符)也是等效的。 - ephemient

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接