2009-04-28 51 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解釋了管道文件句柄。

  • 系統將其輸出到標準輸出(和錯誤)
  • 的反引號捕獲標準輸出,並返回它(而不是標準錯誤)
  • 的管道開放,您可以捕獲輸出和讀它來自文件句柄,或者打印到文件句柄並將其用作外部命令的輸入。

還有一些模塊可以處理跨平臺邊緣案例的這些細節。

相關問題