官术网_书友最值得收藏!

2.2 讀取文件

要讀取文件,可以使用open函數(shù)。本書所說的文件,是純文本文件,而不是二進制文件。先看一個實例:

代碼2-1 ch02/open_file.pl

1 #!/usr/local/bin/perl
2 
3 open my $fh_input, '<', "./open_file.pl" or die "read file failed: $!";
4 while ( my $line = <$fh_input> ) {
5   print $line ;
6 }
7 close $fh_input or die "close file failed: $!";
8 
9 exit 0;

請執(zhí)行一下該程序:

./open file.pl

它將輸出整個程序的內(nèi)容。現(xiàn)在我們逐行說明一下。

第3行,open打開一個文件,并綁定到一個文件句柄(handle),供后續(xù)操作使用。文件句柄可理解為指向該文件的內(nèi)容被讀進內(nèi)存的地址,在這行結(jié)束后,這個文件句柄(即$fh_input)指向文本內(nèi)容的初始位置,即第1行的第1個字符之前的位置。這行語句分成幾個部分,open是命令本身,my $fh_input聲明了一個局部標量,$fh_input作為文件句柄,<表示后面的文件是作為輸入文件被讀取(只讀)的,./open_file.pl即被讀取的文件的文件名,它恰好是程序本身。后面還有or die "…",or是邏輯操作符,它的意義是在左右兩個表達式有一個為“真”時,整個表達式的值為“真”;左右兩個表達式全為“假”時,整個表達式的值為“假”。Perl中的邏輯操作符都有一個特點,當部分表達式的值已經(jīng)可以決定整個表達式的值時,不必查看或執(zhí)行剩余表達式了。我們看一下這個open語句,它在or操作符的左側(cè)作為左側(cè)表達式,當open語句成功時,這個左側(cè)表達式為“真”,那么無論or右側(cè)的表達式是何值,這整個表達式的值都是“真”,所以or右側(cè)的表達式die函數(shù)不會被執(zhí)行。只有當open語句失敗,返回“假”時,die函數(shù)才會執(zhí)行。die函數(shù)的功能就是輸出字符串,然后結(jié)束程序。這正是我們想要的,因為多數(shù)情況下,一旦讀取文件失敗,那么后面的代碼將失去意義,退出程序并檢查代碼是更好的選擇。$!是一個內(nèi)建的標量,它會保留最后(最近)一個系統(tǒng)調(diào)用所產(chǎn)生的錯誤信息。如果我們把第3行的文件名修改為一個不存在的文件(如abc.pl),那么我們可以看到輸出:

read file failed: No such file or directory at ./abc.pl line 3.

你可以試驗一下,去掉or die…部分,再讀取一個不存在的文件,看看結(jié)果。

第4~6行,是一個while循環(huán)結(jié)構(gòu)。它與for類似,my $line聲明了一個局部變量$line,僅在這個while循環(huán)結(jié)構(gòu)中有效。while后面是循環(huán)的條件,每次循環(huán)時,<>操作符會從相關(guān)的文件句柄中讀取一行,然后賦值給$line。直到文件的最后一行被讀取,該條件都為真。在最后一行被讀取之后,再次循環(huán)時,<>就讀取不到任何內(nèi)容了,即為空,那么在條件判斷中表現(xiàn)為“假”,本次循環(huán)體不會被執(zhí)行,循環(huán)結(jié)束。你可能會擔心,my語句在循環(huán)的條件中,會不會每次循環(huán)時都聲明一次局部變量。事實上Perl只會聲明一次,但賦值是每次都會執(zhí)行的,請放心。這里你可能注意到了,$line是包含換行符的。所以在輸出時,不必額外指定"\n"。

第7行,close是關(guān)閉文件句柄的命令。它一般與open成對出現(xiàn),且出現(xiàn)在open之后。在此句close之后文件句柄$fh_input不再有效。這里也同樣使用了or die "…"的用法。

主站蜘蛛池模板: 堆龙德庆县| 安国市| 万荣县| 临潭县| 遂平县| 元氏县| 景德镇市| 安龙县| 斗六市| 丰宁| 长沙县| 海宁市| 江陵县| 屏山县| 施甸县| 罗平县| 若羌县| 东丽区| 广河县| 桃源县| 上饶市| 扬州市| 安泽县| 和硕县| 建宁县| 工布江达县| 略阳县| 洛隆县| 绍兴县| 来宾市| 繁峙县| 鄄城县| 朝阳区| 吉首市| 葫芦岛市| 金川县| 花莲市| 集安市| 昭通市| 广南县| 宁明县|