29

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

system

   system PROGRAM LIST

如:

system "abc";

反引号如:

`abc`;

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

open ABC, "abc|";

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

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

4 回答 4

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

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

于 2009-04-28T10:09:17.320 回答
3

perlipc文档解释了您可以从 Perl 与其他进程交互的各种方式,而perlfunc 的开放文档解释了管道文件句柄。

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

还有一些模块通过跨平台边缘案例处理这些细节。

于 2009-04-28T18:21:42.377 回答
2

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

于 2009-04-28T10:11:42.010 回答
1

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

另请注意

readpipe('...')

是相同的

`...`
于 2009-04-28T17:50:26.710 回答