perl文件操作
Perl 文件操作
Perl 使用一种叫做文件句柄类型的变量来操作文件。
从文件读取或者写入数据需要使用文件句柄。
文件句柄(file handle)是一个I/O连接的名称。
Perl提供了三种文件句柄:STDIN,STDOUT,STDERR,分别代表标准输入、标准输出和标准出错输出。
Perl 中打开文件可以使用以下方式:
open FILEHANDLE, EXPR
open FILEHANDLE
sysopen FILEHANDLE, FILENAME, MODE, PERMS
sysopen FILEHANDLE, FILENAME, MODE
参数说明:
- FILEHANDLE:文件句柄,用于存放一个文件唯一标识符。
- EXPR:文件名及文件访问类型组成的表达式。
- MODE:文件访问类型。
- PERMS:访问权限位(permission bits)。
下表列出了不同的访问模式:
模式 | 描述 |
---|---|
< 或 r | 只读方式打开,将文件指针指向文件头。 |
> 或 w | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
>> 或 a | 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
+< 或 r+ | 读写方式打开,将文件指针指向文件头。 |
+> 或 w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
+>> 或 a+ | 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
open函数
#!usr/bin/perl -W use strict; use Spreadsheet::ParseExcel; use utf8; #引入utf8模块 脚本内的字符串使用utf8作为编码格式 binmode(STDOUT,":encoding(gbk)"); #标准输出使用gbk作为编码格式,也可以把gbk改为gb2312 binmode(STDIN,":encoding(gbk)"); #如果涉及到输入流,例如读文件,不加这条读中文文件会出现乱码 binmode(STDERR,":encoding(gbk)"); #如果异常错误中的字符串有中文,请加上STDERR,否则也会出现乱码 #以写的方式打开文件,如果没有该文件,尝试创建该文件,如果文件存在,那么文件内容被清空 if(open(data, ">test1.txt")) { print "以写的方式打开文件成功\n";
#写入数据到txt文件中
print data "写入数据到test1中\n"; close(data); } else { die "test1.txt 文件无法打开, $!\n"; #没有该文件,提示:can't open perl script "operation.pl": no such file or directory } #以读的方式打开文件,如果没有该文件,不会创建该文件 if(open(data, "<test2.txt")) { print "以读的方式打开文件成功\n"; #逐行读取文件数据,通过文件句柄操作符 while(<data>) { print "$_"; } #使用完后要关闭文件 close(data) || die "无法关闭文件"; } else { die "test2.txt 文件无法打开, $!\n"; #没有该文件,提示:can't open perl script "operation.pl": no such file or directory } #读写方式打开文件,如果没有该文件,就会创建该文件,如果文件存在,文件内容会被清空 if(open(data, "+>test3.txt")) { print "以读写的方式打开文件成功\n"; #使用完后要关闭文件 close(data) || die "无法关闭文件"; } else { die "test3.txt 文件无法打开, $!\n"; #没有该文件,提示:can't open perl script "operation.pl": no such file or directory } #读写方式打开文件,如果文件不存在,不会被创建。如果文件已经存在,原来的数据不会被清除。 if(open(data, "+<test4.txt")) { print "以读写的方式打开文件成功\n"; # #使用完后要关闭文件 close(data) || die "无法关闭文件"; } else { die "test4.txt 文件无法打开, $!\n"; #没有该文件,提示:can't open perl script "operation.pl": no such file or directory } #如果要向文件追加数据,则在追加数据之前只需要以追加的方式打开文件,文件内容不会被清空,而是向尾部追加数据,文件不存在就会被创建 if(open(data,">>test5.txt")) { print "以追加的方式打开文件成功\n"; #使用完后要关闭文件 close(data) || die "无法关闭文件"; } else { die "test5.txt 文件无法打开, $!\n"; #没有该文件,提示:can't open perl script "operation.pl": no such file or directory } #如果需要读取追加的文件,文件不存在就会被创建 if(open(data,"+>>test6.txt")) { print "以读取追加文件的方式打开文件成功\n";
#追加内容到文件中
print data "追加内容到test5中"; #使用完后要关闭文件 close(data) || die "无法关闭文件"; } else { die "test6.txt 文件无法打开, $!\n"; #没有该文件,提示:can't open perl script "operation.pl": no such file or directory }
sysopen函数
类似于 open 函数,只是它们的参数形式不一样。
以下实例是以读写(+<filename)的方式打开文件:
sysopen(DATA, "file.txt", O_RDWR);
如果需要在更新文件前清空文件,则写法如下:
sysopen(DATA, "file.txt", O_RDWR|O_TRUNC );
你可以使用 O_CREAT 来创建一个新的文件, O_WRONLY 为只写模式, O_RDONLY 为只读模式。
The PERMS 参数为八进制属性值,表示文件创建后的权限,默认为 0x666。
下表列出了可能的模式值:
模式 | 描述 |
---|---|
O_RDWR | 读写方式打开,将文件指针指向文件头。 |
O_RDONLY | 只读方式打开,将文件指针指向文件头。 |
O_WRONLY | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
O_CREAT | 创建文件 |
O_APPEND | 追加文件 |
O_TRUNC | 将文件大小截为零 |
O_EXCL | 如果使用O_CREAT时文件存在,就返回错误信息,它可以测试文件是否存在 |
O_NONBLOCK | 非阻塞I/O使我们的操作要么成功,要么立即返回错误,不被阻塞。 |
getc 函数
getc 函数从指定的 FILEHANDLE 返回单一的字符(还有就是用于键盘输入一个字符),如果没指定返回 STDIN:
#以读的方式打开文件,如果没有该文件,不会创建该文件 if(open(data, "<test2.txt")) { print "以读的方式打开文件成功\n"; #从键盘返回一个字符 my $key = getc(STDIN); print "Entered value is $key\n"; #使用完后要关闭文件 close(data) || die "无法关闭文件"; }
输出结果为
D:\>perl FileOperation.pl
以读的方式打开文件成功
4
Entered value is 4
read 函数
read 函数用于从缓冲区的文件句柄读取信息。
这个函数用于从文件读取二进制数据。
read FILEHANDLE, SCALAR, LENGTH, OFFSET
read FILEHANDLE, SCALAR, LENGTH
参数说明:
- FILEHANDLE:文件句柄,用于存放一个文件唯一标识符。
- SCALAR:存贮结果,如果没有指定OFFSET,数据将放在SCALAR的开头。否则数据放在SCALAR中的OFFSET字节之后。
- LENGTH:读取的内容长度。
- OFFSET:偏移量。
如果读取成功返回读取的字节数,如果在文件结尾返回 0,如果发生错误返回 undef。
if(open(data, "<test2.txt")) { print "以读的方式打开文件成功\n"; my $SCALAR; read(data, $SCALAR, 2, 0);#读取的数据保存在SCALAR中,读取的长度为2 print "$SCALAR"; #使用完后要关闭文件 close(data) || die "无法关闭文件"; }
拷贝文件
以下代码将test1的文件内容拷贝到test2中去
#!/usr/bin/perl # 只读方式打开文件 open(data1, "<test1.txt"); # 打开新文件并写入 open(data2, ">test2.txt"); # 拷贝数据 while(<data1>) { print data2 $_; } print "拷贝数据成功\n"; close( data1 ); close( data2 );
文件重命名
将test1.txt重命名为test1_Rename.txt
#文件重命名 rename("D:/test1.txt","D:/test1_Rename.txt");
删除文件
#删除文件 unlink("D:/test1_Rename.txt");
tell 函数
tell 函数用于获取文件位置:如果指定 FILEHANDLE 该函数返回文件指针的位置,以字节计。如果没有指定则返回默认选取的文件句柄。
if(open(data1, "+<test1.txt")) { my $position=tell data1; print "position:$position";#输出文件指针的位置0 close data1; }
4556