在perl中當我們需要建立一個進程的時候,一般都是用比較簡單易用的system,exec,或者``(反單引號),這幾種用法都非常簡單,但是他們不能結合一些作業系統中的管道等高效的東西。
所以在perl中還有一種建立進程的方法,就是把進程當做檔案控制代碼那樣使用。
open(WHOPROC, "who|"); # open who for reading
觀察這句代碼,當其中我們不寫|的時候,who被認為是一個檔案名稱,然後WHOPROC最終將是一個真實的檔案控制代碼。
但當加上|的時候就表示將要開始一個命令。
當然,|可以在who的前面,也可以在後面。表達的意思也不一樣。
當|在後面的時候,表示其前面的命令的的結果將會輸出到前面的進程控制代碼裡。而當|在命令前面的時候,表示前面的控制代碼是用來輸入的,輸入的資料將會被傳給後面的命令。
舉例說明:
(1)
- #! /usr/bin/perl -w
- open (FLIST,"dir | ");
- while(<FLIST>){
- print $;
- }
如上面所講,開始先執行dir命令,然後其結果將輸出到FLIST,然後後面的迴圈將結果依次輸出
(2)
- open(SEARCH,'| find "learning"');
- print SEARCH "learningPerl.pl";
- close(SEARCH);
如上所述,SEARCH將會傳遞資料到後面的命令。第二句中給SEARCH寫入資料,則該資料將會作為參數傳遞給find命令。
然後運行。
下面以上述兩種方法寫一個綜合的例子,以說明他們的好處。
- #! /usr/bin/perl -w
- print "Using Processes as Filehandles/n";
- open (FLS,"dir |");
- open (SEARCH,'| find "learning"');
- while(<FLS>){
- print SEARCH $_;
- }
- close(FLS);
- close(SEARCH);
首先dir的結果輸出到FLS控制代碼裡,然後SEARCH將會傳遞到find命令,在while迴圈裡面將FLS的資料寫入SEARCH,這是find命令以SEARCH控制代碼傳遞的資料作為參數執行,輸出。
最後關閉兩個控制代碼。
值得注意的是,當你不關閉控制代碼的時候,則你建立的進程有可能在你的perl進程結束的時候將不會退出,它將不受你的perl進程的控制。當我們使用close來關閉控制代碼,則你的perl進程將會等到你的進程安全退出的時候才會退出。
當然我們一次可以運行多個命令,
如open(WHOPR, "ls | tail -r |");
通過上面的這個例子,我們可以看到這種用法的方便之處,即完全可以通過管道來傳遞資料,或者得到結果,從而很方便的執行一系列操作,更高效,更方便。