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中文件變量參數可使用表達式。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM