前面一節介紹了Perl中的基本數據類型及其使用方式,本節介紹一下分支循環控制及IO。
Perl中的分支循環在語法上和C家庭語言的語法很相似,關鍵字包括: If / else, for ,while 。前面已經講過,Perl中代碼塊用大括號{}圍起來,表達式以分號結尾,這些都和C相似,但在Perl中,使用if for while時,大括號是強制要求的,這點與c不一樣。細心的人可能會發現前一節講數據類型的時候,並沒有涉及到整形,浮點,bool什么的,只說到了一個標量,事實上在Perl里,這些基本數據類型並不嚴格區分,都可以歸到Scalar里頭去,這也大概算是腳本語言的一個通用做法, 弱化了基本類型。
其它先不提,分支循環在很多語言里有一個很關鍵數據:bool。控制分支走向需要一個判斷點,真要怎樣做,假要怎樣做,但在Perl里,沒有一個具體的true,false類型,所以在做真假判斷時,遵循以下原則:
- 如果是數據類型,0則為假,
- 如果是字符串,空字符串為假。
- 如果是集合,空集合為假。
這些都比較好理解。
(一) 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);
}