|
注意:Tie::File模塊不適用于處理存放大量短小記錄的文件!! 這里所說(shuō)的記錄型文件,是指文件讀寫(xiě)時(shí)的最小單位是記錄而不是通常的字節(jié)。數(shù)據(jù)記錄之間以記錄分隔符隔開(kāi),故要求文件有效數(shù)據(jù)的內(nèi)容不會(huì)與記錄分隔符相混 淆。通常我們使用的文本文件就屬于記錄型文件,它的記錄分隔符在win32下是\r\n序列,在unix下則是\n。對(duì)于記錄型文件,Perl提供了一個(gè) 模塊Tie::File將文件同一個(gè)數(shù)組關(guān)聯(lián)起來(lái),對(duì)數(shù)組進(jìn)行操作就等價(jià)于對(duì)文件本身進(jìn)行操作,數(shù)組內(nèi)容所有的改變都會(huì)立即反映在文件中。更令人興奮的是 同文件相關(guān)的這個(gè)數(shù)組是一個(gè)“虛擬”數(shù)組,本身并不會(huì)占用多少空間,因此即使操作數(shù)以GB計(jì)的文件也十分輕松。其用法如下: use strict; use warnings; use Tie::File; my @lines; # 文件關(guān)聯(lián)數(shù)組 my $filename='./test.dat'; # 記錄文件名 tie(@lines,'Tie::File',$filename) or die; # 將記錄文件同數(shù)組關(guān)聯(lián),默認(rèn)為文本型文件 # 記錄分隔符使用"\r\n"或"\n" $lines[0]="Hello"; # 這里對(duì)數(shù)組內(nèi)容的操作就直接反映到文件中去了 $lines[1]="world!"; # 增加一條新記錄 splice(@lines,1,0,"insert another line"); # 在老記錄之間插入記錄 print "$lines[1]\n"; # 讀出已有記錄的內(nèi)容 $lines[0].=" folks"; # 修改已有記錄的內(nèi)容 delete $lines[0]; # 刪除記錄 untie(@lines); # 解除文件同數(shù)組的關(guān)聯(lián) 這就是對(duì)文本文件的一系列操作,可以看出該模塊使用起來(lái)十分靈活簡(jiǎn)便。除此之外模塊還有幾個(gè)選項(xiàng)可以調(diào)整細(xì)節(jié)行為,常用選項(xiàng)如下: recsep 用于指定記錄分隔符,分隔符可以是任意字符串。每條記錄寫(xiě)入文件時(shí)都會(huì)自動(dòng)附加上一個(gè)記錄分隔符,如果記錄內(nèi)容本身已經(jīng)附加有分隔符則會(huì)忽略(模塊不對(duì)這 一行為作任何擔(dān)保,最好不要自行附加記錄分隔符),讀出記錄內(nèi)容時(shí)會(huì)自動(dòng)去除分隔符(由autochomp選項(xiàng)控制)。默認(rèn)的記錄分隔符是"\r\n" 或"\n",我們可以任意改變它以適應(yīng)自己的需求。唯一需要注意的地方就是記錄分隔符不可與有效數(shù)據(jù)內(nèi)容混淆,也不能為空(沒(méi)有記錄分隔符就談不上記錄型 文件了)。比如我們可以用C語(yǔ)言存放字符串的形式將字符串寫(xiě)入文件: tie(@lines,'Tie::File',$filename,recsep=>chr(0)) or die push(@lines,"Hello,world!"); push(@lines,"That's all, folks!"); 也可以用特定的字節(jié)序列作為分隔符,在文件中存放二進(jìn)制數(shù)據(jù): tie(@lines,'Tie::File',$filename,recsep=>pack("C*",0xff,0x0,0xff,0x0)) or die $lines[0]=pack("C*",0xaa,0xbb,0xcc,0xdd,0xee); autochomp 指定讀出記錄時(shí)是否去除記錄分隔符,為真值時(shí)會(huì)自動(dòng)去除分隔符。如: tie(@lines,'Tie::File',$filename,autochomp=>0) or die; # 保留記錄分隔符 print "'$lines[0]'\n"; # 打印出的內(nèi)容會(huì)包含回車(chē)符 除此之外還有mode、memory、dw_size等選項(xiàng)。另外在指定選項(xiàng)時(shí)可以在選項(xiàng)前加一個(gè)“-”號(hào),即tie(...,-recsep=& gt;...)和tie(...,recsep=>...)這兩種形式是等價(jià)的。對(duì)該模塊的進(jìn)一步說(shuō)明請(qǐng)參考perldoc Tie::File -- 出塞 王昌齡 秦時(shí)明月漢時(shí)關(guān),萬(wàn)里長(zhǎng)征人未還。 但使龍城飛將在,不教胡馬度陰山。 ※ 修改:·chaoslawful 于 Aug 4 23:38:22 修改本文·[FROM: 222.81.18.71] ※ 來(lái)源:·BBS 水木清華站 smth.org·[FROM: 222.81.19.69] |
|
|