l 左右角括號為「整列輸入運算符」,中間夾檔案代號(filehandle)
l 以下程式碼做了:讀取標準輸入、將它存入變數、檢查變數的值是否有定義
while (defined($line
= <STDIN>)){
print “$line”;
}
l 以上程式碼可簡寫為(此簡寫法只限定while和foreach迴圈使用):
while (<STDIN>){
print
“$_”;
}
foreach (<STDIN>){
print “$_”;
}
foreach (<STDIN>){
print “$_”;
}
l 以上方法在while迴圈是一次讀一列;foreach則是在串列語境下一次讀入所有輸入,因此當讀入的檔案越大,foreach將越慢顯示
l 調用引數(invocation argument),命令列上跟在程式名稱後的幾個「單字」
l 調用引數中的「-」連字號代表「標準輸入串流」
l @ARGV為Perl直譯器事先建立的特殊陣列,用來存調用引數所組成的串列
l 鑽石形運算符(diamond operator):<>。用來讀取@ARGV所存的檔案串列,若為空串列則改用標準輸入串流
while (defined($line = <>)){
chomp($line);
print “$line”;
}
while (<>){
chomp;
print “$_”;
}
while (<>){
chomp;
print “$_”;
}
l 當調用引數超過1個時,將會合併為1個檔案,因此不用擔心中間間斷問題
l 鑽石形運算符通常一次處理所有輸入,所以程式當中看到兩個應該是個錯誤
l 鑽石形運算符若無法開啟某個檔案時,會顯示訊息,並直接跳到下一個檔案
l $0為Perl直譯器預設存放程式自己的檔名
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可以在print和printf函式中使用
e.g.1 print LOG “content”;
e.g.2 printf STDOUT “content %d %s”, number, string;
l filehandle和list 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 而die和warn會自動將訊息送到STDERR裡
l 因此若想蒐集錯誤訊息的話,可以重新open一個STDERR到指定的檔案,在使用die或warn
l 若STDIN、STDOUT、STDERR任一個重新open失敗,Perl會自動找回原先的filehandle,前提是尚未改變特殊變數「$^F」
l say是一個在content結尾加上換行符號(\n)的print,可搭配filehandle
l 將filehandle存入純量變數中的優點:做為副常式的引數、可存入陣列或雜湊中、控制其作用範圍
l 而filehandle存入的純量變數通常以「_fh」結尾,e.g. $filehandle_fh
l print的filehandle後不可接逗號,會被當成串列內容