前面一節介紹了Perl中的基礎資料型別 (Elementary Data Type)及其使用方式,本節介紹一下分支迴圈控制及IO。
Perl中的分支迴圈在文法上和C家庭語言的文法很相似,關鍵字包括: If / else, for ,while 。
前面已經講過,Perl中代碼塊用大括弧{}圍起來,運算式以分號結尾,這些都和C相似,
但在Perl中,使用if for while時,大括弧是強制要求的,這點與c不一樣。
細心的人可能會發現前一節講資料類型的時候,並沒有涉及到整形,浮點,bool什麼的,
只說到了一個標量,事實上在Perl裡,這些基礎資料型別 (Elementary Data Type)並不嚴格區分,都可以歸到Scalar裡頭去,
這也大概算是指令碼語言的一個通用做法, 弱化了基本類型。
其它先不提,分支迴圈在很多語言裡有一個很關鍵資料:bool。
控制分支走向需要一個判斷點,真要怎樣做,假要怎樣做,但在Perl裡,沒有一個具體的true,false類型,
所以在做真假判斷時,遵循以下原則:
如果是資料類型,0則為假,
如果是字串,Null 字元串為假。
如果是集合,空集合為假。
這些都比較好理解。
(一)if / else
Perl中的if/else文法上和c語言一致,除了要求一定要有大括弧。
邏輯判斷操作: 與(&&), 或(||),非(!) 文法上也很和C是一致的。
$str = "abc";
@arr = (2,3,4);
if( $str && @arr == 3)
{
}
else
{
}
上面的例子是一種比較傳統老式的寫法,前面我說if / else 和C中的文法一致,其實也不大準確。
Perl自己還提供了一套與C不大一樣的寫法,風格上更像是自然語言一樣。
$var = 2;
Print " hello world" if ($var > 0); #注意這行,等價於: if ($var > 0) { print "hello world";}
這種寫法就像是自然語言裡的倒序了。
像上面這種寫法,還有另外一個關鍵字也是同樣適用的: unless
Print " hello world" unless ($var > 0);
(二)迴圈: for / while / foreach
for ($i=0; $i<100; $i++)
{
print "hello $i \n";
}
while( $i < 100 )
{
print "hello $i \n";
$i++;
}
上面兩字例子示範了 for / while的寫法,可見是和C 在文法上是一樣的。
除了for / while ,Perl還提供了一個 foreach 專門用來處理數組。
@arr = (1,2,3,4,5);
foreach $item (@arr)
{
print "item: $item\n";
}
注意foreach 那一行中的小括弧是不能省的。
(三)I/O
Perl中進行I/O操作延用了unix中的IO概念,一切都抽象成檔案。
所以,I/O操作都是對一個檔案控制代碼(file handle)進行操作,包括標準輸入標準輸出。
(1)標準輸入,標準輸出。
前面範例程式碼中多次用到了print,在之前的寫法這是標準輸出,但它的功能卻不僅限於標準輸出,事實上它的準確原型是:
print <file handle> "hello world\n";
如果省略了 file handle,預設情況下就是標準輸出,標準輸出的控制代碼 <STDOUT>
所以前面的print語句,事實上等價於:
print STDOUT "hello world\n";
對應的標準輸入是STDIN, 這個兩個變數是Perl預定義的。
可以看成是一個關鍵字一樣,也不需要在這些變數前面加$,@這類的符號 。
前面一直只樣本了標準輸出,沒有提過標準輸入。
標準輸入文法上,也很簡潔:
$line = <STDIN>; #read
用角括弧把檔案控制代碼括起來,就相當於從裡面讀資料。
(2)檔案I/O
擷取及關閉檔案要用Open()/Close()函數。
$succ= open(fh,“~/myfile.log”);
if($succ)
{
$line = <fh>;#read one line.
@all = <fh>; #read the whole file.
print "@line \n";
close(fh);
}
值得注意的是,檔案控制代碼的聲明是可以不用加$這種符號,直接寫一個名字就夠了,當然,你如果喜歡加上$,也是沒問題的。
前面的樣本示範了讀入時的最基本的做法,Perl還提供了和C語言裡類似的檔案操作函數:seek, tell,
用來定位到檔案的相應位置進行讀寫。
它們的用法和c語言很相似,具體使用方式,有興趣的讀者可以自己去查閱一下官方文檔。
前面的open()函數樣本了檔案開啟的最基本形式,事實上,這個函數l還支援設定訪問模式。
檔案訪問模式:
訪問模式 例子 說明
讀(Read) open(FH,"< FileName"); 從檔案中讀取
寫(Write) open(FH,"> FileName"); 向檔案中寫入,覆蓋舊檔案中的內容
追加(Append) open(FH,">> FileName"); 向現有檔案的尾部追加資料
讀寫(Read and Write) open(FH,"+< FileName"); 讀取和寫入現有檔案
寫入程式 open(PIPEOUT,"| pipeout"); 開啟程式管道
讀取程式 open(PIPEIN,"pipein |"); 從程式或命令的輸出中取得資料
如果開啟的檔案支援寫操作,我們就可以用Print 函數往檔案裡寫東西:
if(open(fh,">~/file.log"))
{
print fh "hello file\n";
close(fh);
}