2009-04-28 53 views
26

Perl的支持三种方式(即我所知道的)运行外部程序:Perl中的系统和反引号和管道有什么区别?

system

system PROGRAM LIST 

为:

system "abc"; 

反引号,如:

`abc`; 

通过管道运行:

open ABC, "abc|"; 

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

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

回答

35
  • 系统():运行命令并返回命令的退出状态
  • 反引号:运行命令并返回命令的输出
  • 管道:运行命令,并允许您使用作为句柄

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

+0

管道是反引号的更细粒度控制。反引号返回STDOUT,如:$ date =`date`。通过管道,您可以决定何时以及如何读取输出,或者将信号发送给过程。 – 2009-04-28 10:53:45

2

系统还返回应用程序的退出值(Windows中的ERRORLEVEL)。 管道使用起来有些复杂,因为从中读取数据并关闭它们会增加额外的代码。 最后,他们有不同的实现,这是为了做不同的事情。使用管道可以与执行的应用程序进行通信,而其他命令不允许(轻松)执行。

1

获取程序退出状态不限于system()。当您拨打close(PIPE)时,它会返回退出状态,并且您可以从$?获得所有3种方法的最新退出状态。

也请注意,

readpipe('...') 

相同

`...` 
+0

你能完成这句话吗? 请注意,readpipe('...')而不是...。 – 2009-04-28 18:13:57

3

perlipc文档解释了,你可以利用Perl等流程交互的各种方式,并perlfunc's open documentation解释了管道文件句柄。

  • 系统将其输出到标准输出(和错误)
  • 的反引号捕获标准输出,并返回它(而不是标准错误)
  • 的管道开放,您可以捕获输出和读它来自文件句柄,或者打印到文件句柄并将其用作外部命令的输入。

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

相关问题