分类: PERL
2014-09-17 15:09:34
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 =
第二种方法是把文件中的全部内容以行为单位读取到数组@Array中,文件中的每一行(含回车符)作为数组@Array的一个元素,使用数组的下标来访问文件中的不同行;如:
@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每取一个不同的字符串,就可以打开一个与这个字符串所对应的文件,并生成一个对应的文件句柄;但是必须注意:这些简单变量或者表达式的值必须是字符串,以用做文件句柄名称;