Perl-15—檔案操作

來源:互聯網
上載者:User

Perl中使用一種叫做檔案控制代碼類型的變數來操作檔案;Perl使用檔案控制代碼在程式與外部儲存空間中的檔案之間建立了一個可以與外部儲存介質交換資料的IO通道;建議檔案控制代碼全部使用大寫字母表示,以區別於普通的變數;Perl提供了三個內建的、比較特殊的檔案控制代碼變數:STDIN、STDOUT和STDERR,分別代表標準輸入、標準輸出和標準出錯輸出; 一、檔案的開啟與關閉: 1、開啟檔案: Perl中使用open()函數開啟檔案,開啟檔案的文法如下: $OpenFlag = open(FILEHANDLE,“FileName”); FILEHANDLE:這個參數市檔案控制代碼,用於存放一個檔案唯一識別碼; FileName:需要開啟的檔案的名字,可以是相對路徑,也可以是絕對路徑; open()函數在檔案控制代碼FILEHANDLE與檔案名稱FileName之間建立了一個可以進行外部資料IO的通道;open()函數的傳回值是一個表示真假的值,用來判斷開啟檔案是否成功;如果開啟檔案的操作成功,則返回真值(非空值);如果開啟檔案操作失敗,則返回假值(空值null); 有三種方式來判斷開啟檔案的操作: A: if(open(FILEHANDLE,"FileName")) { #開啟檔案成功時的操作 } else { #開啟檔案失敗時的操作 } B: unless (open(HANDLE,"FILENAME")) { #開啟檔案失敗時的操作; } C: open(FILEHANDLE,"FileName") || die("Can't the file:$!"); die()函數和內建變數$!一起使用來列印出錯資訊; 2、關閉檔案: 在使用完檔案之後,要隨時關閉檔案,以重新整理與檔案控制代碼相關聯的輸入輸出緩衝區;關閉檔案的文法如下: close(FILEHANDLE); 實際上,作業系統會在系統緩衝區中儲存檔案控制代碼的所有輸出,直到關閉檔案控制代碼或者是檔案緩衝區填滿;這是作業系統實現的最佳化方法; 3、檔案的訪問模式: Perl中為檔案的訪問提供了4種訪問模式:讀、寫、追加、讀寫; 需要注意:不能對檔案同時使用讀寫和追加的模式訪問;檔案的訪問模式由附加在檔案名稱前面的特殊符號指定; 檔案訪問模式樣本: 訪問模式 例子 說明 讀(Read) open(FH,"< FileName"); 從檔案中讀取 寫(Write) open(FH,"> FileName"); 向檔案中寫入,覆蓋舊檔案中的內容 追加(Append) open(FH,">> FileName"); 向現有檔案的尾部追加資料 讀寫(Read and Write) open(FH,"+< FileName"); 讀取和寫入現有檔案 寫入程式 open(PIPEOUT,"| pipeout"); 開啟程式管道 讀取程式 open(PIPEIN,"pipein |"); 從程式或命令的輸出中取得資料 二、檔案名稱與檔案控制代碼: open()函數中的檔案名稱可以是相對路徑,也可以是絕對路徑;組成檔案路徑的每一個組件都可以通過Perl5所帶的File::Basename模組來解析,這個模組中的函數可以把組成檔案位置資訊的檔案名稱、路徑名和副檔名解析出來; 檔案控制代碼是電腦與檔案之間的直接連接。檔案控制代碼用於讀取和寫入檔案,使用open()函數產生;檔案控制代碼也是一種變數類型,採用標準變數命名規則,但不使用$開頭。一般來說檔案控制代碼變數全部使用大寫字母表示,以表示與其它變數的區別;Perl5程式在啟動時,開啟三個預設的檔案控制代碼: ◆ STDIN:標準輸入,預設設定為鍵盤輸入,程式從命令列輸入的時候需要使用這個檔案控制代碼;從命令列輸入的資料全部都存放在Perl5的特殊內建陣列變數@ARGV中; ◆ STDOUT:標準輸出,預設設定為電腦的顯示器;利用這個檔案控制代碼和print函數可以把程式啟動並執行結果發給輸出裝置; ◆ STDERR:標準出錯輸出,預設設定為電腦的顯示器;如果程式要跟蹤錯誤,那麼可以把STDERR設定為輸出到錯誤檔案; STDIN、STDOUT和STDERR都可以被重新導向到某一個檔案中,或者說都可以與一個檔案相關聯,以使標準輸入來自檔案,或把標準輸出的內容輸出到檔案中,或把標準出錯資訊輸出到檔案中儲存; 三、檔案的讀取: 讀取檔案有兩種方式,一是用電腦記憶體來讀取整個檔案,然後在記憶體中操作檔案,將其讀出;另外一種方式就是使用seek()來在檔案中移動檔案讀寫指標(檔案控制代碼)來讀取檔案的內容; 1、從記憶體中讀取檔案: 使用電腦記憶體讀取整個檔案的內容,然後有兩種方法來處理記憶體中的檔案內容; 第一種方法是每次從檔案中讀取一行資料並儲存到一個簡單變數$Line中,然後把檔案讀寫指標向後移2動一行;如: $Line = ;#從檔案控制代碼FILEHANDLE中讀取一行資料並儲存到簡單變數$Line中; 第二種方法是把檔案中的全部內容以行為單位讀取到數組@Array中,檔案中的每一行(含斷行符號符)作為數組@Array的一個元素,使用數組的下標來訪問檔案中的不同行;如: @Array = ;#把檔案控制代碼FILEHANDLE中的所有行以行為單位讀取到數組@Array中; 由此可見,讀取檔案的操作符<>是根據上下文來決定每次是讀取一行還是讀取檔案中的所有內容的:如果等號左邊是一個簡單的標量變數,則讀取檔案操作符<>每次唯讀取一行,並儲存到這個簡單變數中;如果等號左邊是一個數組,那麼讀取檔案操作符<>就把整個檔案中的內容以行(包含斷行符號符)為單位讀取到數組中,每一行作為數組中的一個元素;如果讀取檔案操作符<>不帶任何參數(即:“<”和“>”之間不帶任何檔案控制代碼),則預設是從標準輸入檔案控制代碼STDIN中讀取資料,即:通過鍵盤從命令列讀取資料; 每次讀取新行時,檔案輸入運算子<>返回1;讀取完最後一行再讀取時,檔案輸入運算子返回空值,這個條件就可以作為判斷檔案讀寫位置指標是否已經到達檔案尾部的條件; 這種方式使用起來比較簡單,適用於小檔案中,但是如果檔案的體積比較大的話,就不合適了,這個時候可以適用seek()函數; 2、使用seek()函數讀取檔案: seek()函數是通過檔案控制代碼來移動檔案讀寫指標的方式來讀取或寫入檔案的,以位元組為單位進行讀取和寫入;使用seek()函數可以定位程式需要讀取或寫入的下一個位置;在開啟一個檔案進行讀取時,檔案讀寫位置指標停在檔案的開頭,每次讀寫檔案中的資料時,檔案讀寫指標就會自動向前移動,其位置是讀寫停止的位置;在開啟一個檔案進行追加時,檔案的讀寫位置指標停在檔案尾部;當需要在檔案開頭和結尾之間進行轉移時,就需要使用seek()函數進行檔案讀寫位置定位; seek()函數可以在檔案中隨意地移動檔案控制代碼(檔案讀寫指標)的位置;seek()函數有三個基本的位置:檔案開頭(0)、當前位置(1)和檔案末尾(2),可以從這些位置處指定位移量,來指定檔案控制代碼(檔案讀寫指標)在檔案中所要移動到的位置; seek()函數的文法如下: seek(FILEHANDLE,BytesToSkip,StartLocation); BytesToSkip:表示檔案控制代碼(讀寫位置指標)要移動的位元組數;如果尾為正數,則表示向檔案尾的方向移動;如果為負數,則表示向檔案頭的方向移動;需要注意的是,檔案控制代碼(讀寫位置指標)不能移動到檔案頭和檔案尾之外的地方,即:檔案控制代碼(讀寫位置指標)只能在檔案頭和檔案尾之間進行移動;每個英文字母和標點符號各佔用一個位元組,而每個漢字和中文標點符號則各需要佔用兩個位元組; StartLocaltion:表示檔案控制代碼(讀寫位置指標)開始移動時的起始位置,可以取的值為0、1、2;分別表示檔案開頭、當前位置和檔案尾; FILEHANDLE:需要被操作的檔案控制代碼; 函數調用成功時返回非零值(真),失敗時返回零值(假);常與tell()函數合用; 在兩個seek()調用之間不必關閉檔案再重新開啟,這樣就提高了檔案的讀取速度; 3、tell()函數: 使用seek()函數定位檔案讀寫位置指標時的一個最大的缺點就是,它以位元組為單位來定位檔案讀寫位置指標,在不同的電腦上的可移植性較差,程式不一定能在其它電腦上運行; 解決這個問題的方法就是使用tell()函數來提取檔案讀寫位置指標所指向的位置;文法如下: $Position = tell(FILEHANDLE); seek(FILEHANDLE,$Position,0) ; 這個函數用於返回從檔案開頭位置處到當前讀寫位置處的距離(位元組數); 注意:seek()函數和tell()函數不能用於指向管道的檔案變數; 四、檔案的寫入: 寫檔案的文法如下: print OUTFLEHANDLE (DATA); 例子: print OUTFILEHANDLE ("Hello,Perl World/n"); 如果要向檔案中追加資料,則在追加資料之前,只需要以追加方式開啟檔案即可: open(OUTFILEHANDLE,">> FileName"); 五、修改檔案: 有兩種方法可以修改檔案,一是直接在硬碟的儲存空間中修改檔案;另外一種方法就是使用記憶體作為修改檔案內容的空間;使用記憶體時,速度比較快,但是不適合超大檔案;使用硬碟空間時,適合超大檔案,但是速度慢; 使用記憶體來修改檔案時,只需要把檔案以讀寫方式開啟就可以了,開啟之後,先讀取檔案內容,然後修改已讀出的資料,接著把修改後的資料直接寫入檔案中對應的位置處,最後修改結束之後,關閉檔案; open(FILEHANDLE,"+< FileName");#以讀寫方式開啟檔案; 注意:在使用完檔案之後一定要記住關閉已經開啟的檔案; 六、間接檔案控制代碼: 對於open、close、print 、printf、write、select、eof等檔案操作函數,都可以使用簡單的標量變數來替換這些函數的檔案控制代碼參數,這時,簡單的標量變數中所儲存的資料必須是字串類型,這些字串就被看作檔案控制代碼名稱;需要指出的是,open、close、write、select和eof等檔案操作函數還允許使用運算式來替代檔案控制代碼,但是運算式的值必須是字串,被用做檔案控制代碼名稱;有了這樣的特性,我們就可以通過隨意地構造字串來動態地構造檔案控制代碼名稱,以達到操作不用檔案的目的;使用簡單變數替換檔案控制代碼參數的文法如下: $FileHandle = "INFILE"; $OpenFlag = open($FileHandle,"FileName1"); $FileHandle = "OUTFILE"; $OpenFlag = open($FileHandle,"FileName2"); 在這些語句中,簡單變數$FileHandle的值是可以隨意變化的,這樣簡單變數$FileHandle每取一個不同的字串,就可以開啟一個與這個字串所對應的檔案,並產生一個對應的檔案控制代碼;但是必須注意:這些簡單變數或者運算式的值必須是字串,以用做檔案控制代碼名稱;

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.