2012年10月23日

Learning Perl 4


l   左右角括號為「整列輸入運算符」,中間夾檔案代號(filehandle)
l   以下程式碼做了:讀取標準輸入、將它存入變數、檢查變數的值是否有定義
while (defined($line = <STDIN>)){
        print “$line”;
}
l   以上程式碼可簡寫為(此簡寫法只限定whileforeach迴圈使用)
while (<STDIN>){
           print “$_”;
}

        foreach (<STDIN>){
           print “$_”;
        }
l   以上方法在while迴圈是一次讀一列;foreach則是在串列語境下一次讀入所有輸入,因此當讀入的檔案越大,foreach將越慢顯示
l   調用引數(invocation argument),命令列上跟在程式名稱後的幾個「單字」
l   調用引數中的「-」連字號代表「標準輸入串流」
l   @ARGVPerl直譯器事先建立的特殊陣列,用來存調用引數所組成的串列
l   鑽石形運算符(diamond operator)<>。用來讀取@ARGV所存的檔案串列,若為空串列則改用標準輸入串流
while (defined($line = <>)){
        chomp($line);       
        print “$line”;
}

while (<>){
   chomp;
   print “$_”;
}
l   當調用引數超過1個時,將會合併為1個檔案,因此不用擔心中間間斷問題
l   鑽石形運算符通常一次處理所有輸入,所以程式當中看到兩個應該是個錯誤
l   鑽石形運算符若無法開啟某個檔案時,會顯示訊息,並直接跳到下一個檔案
l   $0Perl直譯器預設存放程式自己的檔名
l   print @array; 無空格;print “@array”; 有空格
l   print 要處理一串印出的字串,因此在串列語境下執行(在沒加圓括號時)
l   print 可選擇不加圓括號,有加的情況下則被當作函式呼叫,傳回值真或假
l   print (2+3)*4; 會印出5而非20,因為把圓括號當函式用了
l   printf %d 中間可加數字代表預設字元數,正為右推齊,負為左推齊
l   printf %% 為印出百分比符號
l   printf "Item List:\n" . ("%-10s\n" x @items), @items; 請思考這行程式
l   open filehandle_name, “開檔模式”, “filename”; 建立一個新的檔案代號
l   開檔模式字串為「<」表輸入;「>」表輸出(直接覆蓋原有的);「>>」以附加方式輸出
l   開檔模式後可接「:encoding(xxx)」指定編碼
l   close filehandle_name; 關閉檔案代號
l   die函式印出指定訊息,用標準錯誤串流處理,使程式以非零(錯誤)狀態立刻中止,若將「$!」放到錯誤訊息字串裡即代表錯誤訊息字串
l   務必檢查open的傳回值,0為成功;非0為失敗
l   use autodie; 自動幫你操作die函式
l   以「>」、「>>」開啟的filehandle可以在printprintf函式中使用
e.g.1 print LOG “content”;
e.g.2 printf STDOUT “content %d %s”, number, string;
l   filehandlelist content之間沒有逗號,因為filehandle是一個「間接受詞」
I gave Neo a book. or I gave a book to Neo. book是直接受詞;Neo是間接受詞
Program print filehandle contents. or Program print contents to filehandle.同理
l   由於預設輸出filehandle就是STDOUT,因此print/printf可以省略STDOUT,但可以使用「select」改變預設
l   資料輸出到filehandle預設是會經過緩衝區,可以將「$|」的值改為1即可立刻輸出資料
l   某個filehandle在存在的情況下要再次open,則Perl會自動幫你關閉舊有的filehandle,因此非特殊情況下不應該重新open Perl的六個標準filehandle
l   diewarn會自動將訊息送到STDERR
l   因此若想蒐集錯誤訊息的話,可以重新open一個STDERR到指定的檔案,在使用diewarn
l   STDINSTDOUTSTDERR任一個重新open失敗,Perl會自動找回原先的filehandle,前提是尚未改變特殊變數「$^F
l   say是一個在content結尾加上換行符號(\n)print,可搭配filehandle
l   filehandle存入純量變數中的優點:做為副常式的引數、可存入陣列或雜湊中、控制其作用範圍
l   filehandle存入的純量變數通常以「_fh」結尾,e.g. $filehandle_fh
l   printfilehandle後不可接逗號,會被當成串列內容

沒有留言:

張貼留言