Chinaunix首页 | 论坛 | 博客
  • 博客访问: 160612
  • 博文数量: 25
  • 博客积分: 2446
  • 博客等级: 大尉
  • 技术积分: 258
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-18 21:19
文章分类

全部博文(25)

文章存档

2011年(1)

2010年(20)

2009年(4)

分类:

2010-11-12 00:31:00

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",我们可以任意改变它以适应自己的需求。唯一需要注意的地方就是记录分隔符不可与有效数据内容混淆,也不能为空(没有记录分隔符就谈不上记录型文件了)。            
          (@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. (@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=>...)和tie(...,recsep=>...)这两种形式是等价的。对该模块的进一步说明请参考perldoc Tie::File

阅读(3928) | 评论(1) | 转发(0) |
0

上一篇:linux的lcx

下一篇:系统 缓冲

给主人留下些什么吧!~~

chinaunix网友2010-11-12 17:25:40

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com