perl学习之文件句柄filehandle
句柄handle 分为文件句柄和目录句柄,文件句柄实际上包含文件,进程和套接字的读写。
文件句柄的操作步骤
open(FD,"filename");
@lines=<FD>;
close(FD);
open()由以下几个用法
open(FD,"> filename") 写数据进文件
open(FD,">> filename") 追加数据进文件
open(FD,"filename") 读文件
open(FD,"process |") 读进程结果
open(FD,"| to process") 往进程中写数据,不过对WINDOWS系统写会有问题
$line=<FD> 获取起始行
如果要遍历整个文件
while (defined $line=<FD>) {}
@lines=<FD> 将整个文件放入lines数组中
可以使用FileHandle包,可以避免变量覆盖的现象。
use FileHandle;
$fileHandleName= new FileHandle("filename");
$line=<$fileHandleName>;
close() 关闭文件句柄
实际上,perl会在句柄超出范围或程序结束时,自动关闭。
写入操作
print (@arrayName) 或 print FILEHANDLENAME (@arrayName)
也可以用以下方式来写入
foreach $line(@arrayName)
{
print FILEHANDLENAME "$line\n";
}
使用$line的好处是,程序在运行时,会将$line的值立即放入文件中。而使用@arrayname的方式会先放入缓存中累积,如果出现进程中断,会倒是输出数据丢失。如果要避免这个问题出现可以把$|设置为1
对二进制文件的读写
使用binmode FILEHANDLE
具体实例
open(IN_FD,"test.gif");
open(OUT_FD," > copy.gif");
binmode(IN_FD);
binmode(OUT_FD);
while(read(IN_FD,$buffer,1024){
print OUT_FD,$buffer;
}
close(IN_FD);
close(OUT_FD);
select(FILEHANDLE) 用于设定输出的默认句柄
在select指定句柄后,随后输出在默认情况下,会输出到指定的句柄
open(FD,"> newfile");
select(FD);
print "test"; #将test添加到newfile中
select(STDOUT);
print "ok"; #将ok输出到屏幕
flock()文件加锁,只适用unix,其他系统或网络文件可能无效
1 创建共享锁 2 创建排他锁 4 创建非阻塞锁 8 排除当前锁
open(FD,">> inputfile");
flock(FD,2);
print FD "test string";
flock(FD,8);
close(FD);
seek()使用,可以让文件指针指向到指定位置
seek(FILEHANDLE,BYTEOFFSET,FILEPOSITION)
BYTEOFFSET 用于位移值,可以是正负值
FILEPOSITION 位置值,0表示到文件开头,1文件中的当前位置,2文件末尾位置
tell()返回文件中当前字节的位置
打开文件进行读写的操作
open(FD,"+<filename") 先读后写
open(FD,"+>filename") 先写后读
open(FD,"+>>filename") 先追加后读
狠芯低成本,专芯低功耗,计划高性能。