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