Perl模組之Tie::File

zk1878發表於2011-04-27

原文:http://hi.baidu.com/mylongwalk/blog/item/004df0220cc2cc4dad34dea0.html

perl的Tie::File模組真是與乎尋常的強大

Tie::File:  
             Tie::File - Access the lines of a disk file via a Perl array: 將一個file和array tie起來,對array所做的任何操作都會同步反映到file上,等同於對檔案進行了操作。

注意: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"); # 在老記錄之間插入記錄                                                     
delete $lines[0]; # 刪除記錄                                                     

untie(@lines); # 解除檔案同陣列的關聯                                            

這就是對文字檔案的一系列操作,可以看出該模組使用起來十分靈活簡便。除此之外模組還有幾個選項可以調整細節行為,常用選項如下:

    1. recsep
    類似於$/, 用來指定記錄分隔符,分隔符可以是任意字串。每條記錄都不包含分隔符,但寫入檔案時都會自動附加上一個記錄分隔符,如果記錄內容本身已經附加有分隔符則會忽略。讀出記錄內容時會自動去除分隔符(由autochomp選項控制)。預設的記錄分隔符是"\r\n"或"\n",我們可以任意改變它以適應自己的需求。唯一需要注意的地方就是記錄分隔符不可與有效資料內容混淆,也不能為空(沒有記錄分隔符就談不上記錄型檔案了)。            
         tie (@array, 'Tie::File', $file, recsep => 'es');
This says that records are delimited by the string es . If the file contained the following data:
         Curse these pesky flies!\n
then the @array would appear to have four elements:
1."Curse th"
2 ."e p"
3."ky fli"
4."!\n"

            

    2. autochomp
    指定讀出記錄時是否去除記錄分隔符,(預設)為真值時會自動去除分隔符。如:
     Normally, array elements have the record separator removed, so that if the file contains the text

  1. Gold
  2. Frankincense
  3. Myrrh

    the tied array will appear to contain ("Gold", "Frankincense", "Myrrh")(不包括換行)If you set   autochomp to a false value, the record separator will not be removed. If the file above was tied with

  1. tie (@gifts, "Tie::File", $gifts, autochomp => 0);

   then the array @gifts would appear to contain ("Gold\n", "Frankincense\n", "Myrrh\n") , or (on Win32 systems) ("Gold\r\n", "Frankincense\r\n", "Myrrh\r\n") .      

   3. splice
     spice是perl命令,不是此模組所獨有,用法如下:
    splice ARRAY,OFFSET,LENGTH,LIST
    splice ARRAY,OFFSET,LENGTH
    splice ARRAY,OFFSET
    splice ARRAY    
    從第offset個元素開始,刪除長度為length個元素,若list存在,則 用list代替刪除掉的資料(若lenght=0,則變成了新增)。若省略length,則刪除從offset開始的所有資料。offset和 length都省略則刪除所有元素。

除此之外還有mode、memory、dw_size等選項。另外在指定選項時可以在選項前加一個“-”號,即tie(...,-recsep=& gt;...)和tie(...,recsep=>...)這兩種形式是等價的。對該模組的進一步說明請參考perldoc Tie::File
http://perldoc.perl.org/Tie/File.html

相關文章