5,輸入與輸出(perl語言筆記)

tonykorn97發表於2007-06-21
1,讀取標準輸入
while (defined($line = )) {
print "I saw $line";
}
簡寫
while () {
print "I saw $_";
}

2, 從鑽石運算子輸入
鑽石運算子:<>
它能讓程式在處理呼叫引數時,提供類似於標準unix工具程式的用法。若時不提供任何呼叫引數,程式應該改成出來標準輸入流。但有個特

例;如果某個引數是連字元(-),那耶代表標準輸入。
鑽石運算子是整行輸入運算子的特例,例如:
while (defined($line = <>) {
chomp ($line);
print "It was $line that I saw! ";
}
既然是整行輸入運算子的一種特例,因此可以使用先前我們所看到的簡寫,將輸入讀取到預設的$_裡:
while (<>) {
chomp;
print "It was $_ that I saw; ";
}

3, 呼叫引數
嚴格來說,鑽石運算子並不好真的去檢查呼叫引數,它靠的是@ARGV陣列。這個陣列是由perl直譯器事先建立的特殊陣列,其內容就是呼叫

引數所組成的列表。
鑽石運算子如何絕對使用那些檔名?方法如下:它會查詢@ARGV,如果它找到的是空列表,就會改用標準輸入流;否則,就會使用@ARGV裡

的檔案列表。這表示程式開始執行之後,只要尚未使用鑽石運算子,就都可以對@ARGV動點手腳。舉例來說,我們可以不管使用者在命令列指定了

什麼,而是一律出來3個特定的檔案:
@ARGV = qw / larry moe curly /;
while (<>) {
chomp;
print "It was $_ that I saw in som stooge-like file! ";
}

4, 輸出至標準輸出

5, printf格式化輸出結果
printf運算子的引數包括“格式字串”以及“所要輸的資料列表”,格式字串是填空用的模板,代表你想要輸出的格式:
printf "Hello , %s; your password expires in %d days! ", $user,$days_to_die;
格式字串裡可以有多個所謂的“轉換”(conversion).每種轉換都會以百分符號(%)開頭,然後以某個字母結尾。
printf可用的轉換格式很多,所以我們在這裡會說明最常用的部分。
%g:要輸出恰當的數值形式,可以使用%g,它會依需自動選擇浮點數,整數甚至是指數形式。
%d:代表十進位制的整數,它會捨去小數點之後的整數。
%s:代表字串,所以它相當於將所提供的值當成字串進行替換,但是可以設定欄位寬度;如果寬度是負值,則向左對齊。
%f:會依需要四捨五入,甚至還可以指定小數點之後的輸出位數。

6,檔案控制程式碼
6個各具特殊用途的檔案控制程式碼名稱:STDIN,STDOUT,STDERR,DATA,ARGV和ARGVOUT

7,開啟檔案控制程式碼
perl所提供的3種檔案控制程式碼STDIN,STDOUT和STDERR,都是由perl程式的父程式自動開啟的檔案或裝置。當你需要其它的檔案控制程式碼時,請使用

open運算子告訴perl,要求作業系統為你的程式和外界開啟一道橋樑。例如:

open CONFIG, "dino";
open CONFIG, " open BEDROCK, ">fred";
open LOG, ">>logfile";
第一個例子會開啟名為CONFIG的檔案控制程式碼,讓它聯絡到檔案dino。換句話說,它會打擊檔案dino.
第二個例子和第一個所作的事情完全相同,但是第二個例子的小於符合明示了“這個檔案是用來輸入資料的”,雖然那已經是預設的行為。
第三個例子會開啟檔案控制程式碼BEDROCK並輸出到新檔案fred。
第四個例子使用兩個大於號指明以新增的方式開啟檔案。

open另一種3個引數的寫法
open CONFIG, " open BEDROCK, ">", $file_name;
open LOG, ">>", &logfile_name();
其優點在於語法上可以很清楚的界定檔案的模式字串(第二個引數)與檔名本身(第三個引數)。

8,不良的檔案控制程式碼
my $success = open LOG, ">>logfile"; #獲取返回值
unless ($success){
#open失敗了
...
}

9,關閉檔案控制程式碼
close BEDROCK;
當重新開啟某個檔案控制程式碼時,perl會自動關閉原先的檔案控制程式碼。在程式結束時,perl也會自動關閉檔案控制程式碼。

10, 用die來處理嚴重錯誤
die函式會輸出你所指定的資訊,並且讓你的程式在非零的結束狀態下立刻終止。
if (! open LOG, ">>logfile") {
die "Cannot create logfile:$!";
}
如果open失敗,die會終止程式的執行,並且告訴我們“無法建立日誌檔案”。裡面的$!代表著給人看的系統抱怨資訊。

11,用warn送出警告資訊
die的功能是產生像perl的內建錯誤這樣的嚴重錯誤。相同的,warn函式的功能就是產生類似於perl的內建警告資訊的資訊。

12,使用檔案控制程式碼
當檔案控制程式碼以讀取模式開啟後,你可以輕易地從它讀取一行資料,就像從STDIN讀取標準輸入流一樣。因此,以“從unix系統讀取密碼檔案

”為例:
open PASSWD, "/etc/passwd"
or die "How did you get logged in?($!)";
while () {
chomp;
...
}
在這個例子裡,die的資訊中用了一對括號圍住$!.它們只不過十括住輸出資訊的括號而已(有時候標點符號及時標點符號)。所謂的“整

行輸入運算子”是由兩部分組成的:一對角括號(真正的整行輸入運算子)以及裡面用來輸入的檔案控制程式碼。

13,改變預設的檔案控制程式碼
原則上,假如不為print提供檔案控制程式碼,它的輸出就會送到STDOUT.不過,你可以使用select運算子來改變預設的檔案控制程式碼。在下面這個範

例裡,我們會將輸出送到BEDROCK這個檔案控制程式碼;
select BEDROCK;
print "I hope Mr. Slate doesn't find out about this. ";
print "Wilma! ";

14, 重新開啟標準檔案控制程式碼
#送出錯誤資訊doa我自己的錯誤資訊日誌中
open STDERR, ">>/home/barney/.error_log"
or die "Can't open error log for append:$!";
重新開啟STDERR之後,任何從perl產生的錯誤資訊都會送到新的檔案裡。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245691/,如需轉載,請註明出處,否則將追究法律責任。

相關文章