1. 程式人生 > >Perl的Open函式

Perl的Open函式

犯了個汗顏的錯誤。。在使用perl裡的open函式時,覺得如果使用者沒有許可權開啟檔案,則會丟擲異常。。無語。。學java學到傻了。perl事實上跟C有點相似,開啟會返回非0,打不開會返回0而已。。。

以下是拷貝自http://blog.csdn.net/stonesharp/article/details/6744634

一.檔案操作
        1.開啟檔案
        用open函式可將檔案控制代碼與某檔案聯絡起來,提供訪問檔案的介面,即開啟檔案.
        語法為:
                open(FILEVAR, "filepath");
        filepath可以有如下三種模式:
                "filepath"        以只讀模式開啟檔案.
                ">filepath"       以寫模式開啟檔案.
                ">>filepath"      以追加模式開啟檔案,寫和追加的區別在於寫模式將原檔案覆蓋,而追加模式則在檔案末尾處新增內容.
                "+>filepath"      以讀和寫方式開啟檔案.
                "+>>filepath"     以讀和追加方式開啟檔案.
        open的常見用法如下:
                if (open(MYFILE, "myfile"))
                {
                        # here's what to do if the file opened successfully
                }
        當檔案開啟失敗時結束程式
                unless (open (MYFILE, "file1"))
                {
                        die ("cannot open input file file1\n");
                }
        亦可用邏輯或操作符表示如下:
                open (MYFILE, "file1") || die ("Could not open file");

        2.開啟管道
        用open函式也可像命令列一樣,開啟和使用管道.
        語法為:
                open(MYVAR, "mode");
        mode有如下兩種模式:
                "|command"        表示對MYVAR的輸出相當於對command的輸入.
                "command|"        表示command的輸出作為對MYVAR的輸入.
        例如:
                open(FILE1, "who|") or die("Could not open file.\n");
                while ($line = )
                {
                        print $line;
                }

        3.檔案重定向
        許多UNIX shell可以把標準輸出檔案(STDOUT)和標準錯誤檔案(STDERR)都重定向到同一個檔案.
        例如在BASH中,命令`$ foo > file1 2>&1`把輸出到標準輸出和標準錯誤的內容存貯到檔案file1中.
        用open函式可以實現檔案重定向.
        如以上命令可以用如下命令實現:
                open (STDOUT, ">file1") || die ("open STDOUT failed");
                open (STDERR, ">&STDOUT") || die ("open STDERR failed");

        4.讀取檔案
        語句$line = ;從檔案中讀取一行資料儲存到簡單變數$line中並把檔案指標向後移動一行.
        語句@array = ;把檔案的全部內容讀入陣列@array,檔案的每一行(含回車符)為@array的一個元素.
        注:為標準輸入檔案,通常為鍵盤輸入,不需要開啟.
        例如:
                open(FILE1, "testfile") or die("Could not open file.\n");
                @line = ;
                foreach $message (@line)
                {
                        print $message;
                }
        此外perl還提供以下幾個系統讀函式.
        函式read
        呼叫語法:
                read (filevar, result, length, skipval);
                read函式設計得與UNIX的fread函式等效,可以讀取任意長度的字元存入一個簡單變數.
                filevar表示檔案變數
                result表示存貯結果的簡單變數
                length表示讀取的位元組數
                skipval(可選項),指定讀檔案之前跳過的位元組數.
                返回值為實際讀取的位元組數,如果已到了檔案末尾,則返回零.如果出錯,則返回空串.
        函式sysread
        呼叫語法:
                sysread (filevar, result, length, skipval);
                更快的讀取資料,與UNIX函式read等效,引數與read相同.
        函式getc(讀取單個字元)
        呼叫語法:
                $char = getc (infile);
                從檔案中讀取單個字元。
        函式binmode(讀取二進位制檔案)
        呼叫語法:
                binmode (filevar);
                當你的系統(如類DOS系統)對文字檔案和二進位制檔案有所區別時使用.必須在開啟檔案後,讀取檔案前使用.

        5.寫入檔案
        寫入檔案通常用print,printf和write這三個函式.
        print是這三個函式中最簡單的,它向指定的檔案輸出,如果未指定,則輸出到當前預設檔案中.
        如:
                print ("Hello, there!\n");
                print OUTFILE ("Hello, there!\n");
        第一句輸出到當前預設檔案中,若未呼叫select,則為STDOUT.
        第二句輸出到由檔案變數OUTFILE指定的檔案中.
        printf函式先格式化字串再輸出到指定檔案或當前預設檔案中.
        如:
                printf OUTFILE ("you owe me %8.2f", $owing);
        此語句取出變數$owing的值並替換掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮點數.
        printf的域格式表如下:
                %c      單個字元
                %d     十進位制整數
                %e     科學計數法形式的浮點數  
                %f     普通形式(定點)浮點數
                %g     緊縮形式浮點數
                %o     八進位制整數
                %s     字串
                %u     無符號整數
                %x     十六進位制整數
        域格式的注意事項:
                A.在格式d,o,u或x中,如果整數值較大或可能較大,可加個l字元,意為長整型,如%ld.
                B.%字元後加正整數表示該域的最小寬度,如果寬度不足,則向右對齊,前面用空格補足.如果該正整數以數字0打頭,則補足字元為0.若%字元後為負整數,則結果向右對齊.
                C.浮點數域值(%c,%f和%g)中可以指定小數點前後的寬度,如%8.3f意為總寬度為8個字元,小數點後(即小數部分)為3個字元,多出的小數部分四捨五入.
                D.在整數,字元或字串的值域中使用如上的小數形式n.m,n為總寬度,m為輸出結果的最大寬度,這樣就保證了輸出結果前至少有n-m個空格.
        write函式使用輸出格式把資訊輸出到檔案中.
        此外perl還提供以下系統寫函式.
        函式syswrite
        呼叫語法:
                syswrite (filevar, data, length, skipval);
                更快的寫入資料,與UNIX函式write等效.
                filevar:將要寫入的檔案
                data:存貯要寫入資料的變數
                length:要寫入的位元組數
                skipval寫操作之前跳過的位元組數
        最後注意:
                有些作業系統在對檔案寫入資料時,會先把資料拷貝到一片特殊的記憶體即緩衝區中,接下來的輸出操作繼續寫入緩衝區直到寫滿.當緩衝區滿了,就把全部資料實際寫入.
                象這樣先寫入緩衝區再把整個緩衝區的內容輸出比每次都實際輸出所花費的時間要少得多,因為一般來說,I/O比記憶體操作慢得多.
                在perl中,如果要使當前預設檔案的輸出不進行緩衝,可對$|賦一個非0值.
                        select (OUTFILE);
                        $| = 1;
                這樣就關閉了對OUTFILE檔案寫入的緩衝.

        6.關閉檔案
        close函式可用來關閉已開啟的檔案.
        當用close關閉管道,即重定向的命令時,程式等待重定向的命令結束.
        如:
                open (MYPIPE, "cat file*|");
                close (MYPIPE);
        當關閉此檔案變數時,程式暫停執行,直到命令cat file*執行完畢.

        7.select函式
        select函式將通過引數傳遞的檔案變數指定為新的當前預設檔案.
        如:
                select (MYFILE);
        這樣,MYFILE就成了當前預設檔案,當對print,write和printf的呼叫未指定檔案時,就輸出到MYFILE中.


        8.eof函式
        eof函式檢視最後一次讀檔案操作是否為檔案最後一個記錄.如果是,則返回非零值;如果檔案還有內容,返回零.
        一般情況下,對eof的呼叫不加括號,因為eof和eof()是等效的.但與<>操作符一起使用時,eof和eof()就不同了.
        
        9.檔案定位
        tell函式和seek函式配合使用,可輕鬆實現檔案內部的定位.
        tell函式的呼叫格式如下:
                tell (filevar);
        用於返回從檔案頭到當前位置的距離。
        seek函式的呼叫格式如下:
                seek (filevar, distance, relative_to);
                distance表示移動的位元組數,正數向前移動,負數往回移動.
                reletive_to的值可為0,1或2.為0時,從檔案頭開始移動;為1時,相對於當前位置移動;為2時,相對於檔案末尾移動.
        命令執行成功返回真,失敗則返回零.
        注意:
                A.seek和tell不能用於指向管道的檔案變數。
                B.seek和tell中檔案變數引數可使用表示式。