Perl文件操作概述
Perl使用一种叫做文件句柄
类型的变量来操作文件。从文件读取或者写入数据需要使用文件句柄。文件句柄(file handle)是一个I/O连接的名称,可以简单地地理解为控制文件的某个东西。Perl提供了三种文件句柄:STDIN,STDOUT,STDERR,分别代表标准输入、标准输出和标准出错输出。
Perl 中打开文件可以使用以下方式:
参数说明:
Open函数
只读方式打开
open是打开某个文件的函数,它的用法为open(filevar,filenmae)
,其中,filevar是文件句柄,filename是文件名,路径可以是绝对路径,也可以是相对路径。open(DATA,"<file.txt");
表示以只读的方式(只读的方式是<
号)打开文件file.txt
。如下所示:
|
|
写入方式打开
写入方式打开是用>
符号,使用格式为:
|
|
读写方式打开
如果要以读写方式打开文件,需要要>
或<
字符前添加+
号,这种方式不会删除文件原来的内容,它的格式如下:
|
|
删除文件内容
删除文件内容,需要在+
号后面添加>
符号,如下所示:
|
|
追加数据
追加数据使用双大于号(>>
),如下所示:
|
|
读取追加文件的内容
在追加符号前面加上+
号即可,如下所示:
|
|
不同的访问模式汇总
模式 | 描述 |
---|---|
< 或r |
只读方式打开,将文件指针指向文件头。 |
> 或w |
写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
>> 或a |
写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
+< 或r+ |
读写方式打开,将文件指针指向文件头。 |
+> 或w+ |
读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
+>> 或a+ |
读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。 |
Sysopen函数
sysopen
函数类似于open
函数,它的使用格式如下所示:
|
|
参数解释:
|
|
以读写(+<filename
)的方式打开文件的代码是sysopen(DATA,"file.txt",O_RDWR);
如果需要在更新文件前清空文件,代码是`sysopen(DATA,”file.txt”,O_RDWR|O_TRUNC);。所有的模式值如下表所示:
模式 | 描述 |
---|---|
O_RDWR | 读写方式打开,将文件指针指向文件头。 |
O_RDONLY | 只读方式打开,将文件指针指向文件头。 |
O_WRONLY | 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。 |
O_CREAT | 创建文件 |
O_APPEND | 追加文件 |
O_TRUNC | 将文件大小截为零 |
O_EXCL | 如果使用O_CREAT时文件存在,就返回错误信息,它可以测试文件是否存在 |
O_NONBLOCK | 非阻塞I/O使我们的操作要么成功,要么立即返回错误,不被阻塞。 |
Close函数
在文件使用完后,要关闭文件,以刷新与文件句柄相关联的输入输出缓冲区,关闭文件的语法如下:
|
|
FILEHANDLE 为指定的文件句柄,如果成功关闭则返回 true,如下所示:
|
|
读写文件
向文件读写信息有几种不同的方式。
第一种方式:<FILEHANDLE>操作符
从打开的文件句柄读取信息的主要方法是<FILEHANDLE>操作符
。在标量上下文中,它从文件句柄返回单一行,如下所示:
|
|
getc 函数
xgetc
函数从指定的FILEHANDLE
返回单一的字符,如果没指定返回 STDIN:
|
|
如果发生错误,或在文件句柄在文件末尾,则返回 undef。
read函数
read函数用于从缓冲区的文件句柄读取信息。
这个函数用于从文件读取二进制数据,格式如下所示:
|
|
参数说明:
print函数
对于所有从文件句柄中读取信息的函数,在后端主要的写入函数为 print:
利用文件句柄和print函数可以把程序运行的结果发给输出设备(STDOUT:标准输出),如下所示:
|
|
文件操作实例
复制文件数据
在下面的案例中,打开一个已经存在的文件file1.txt
,并读取它的每一行,写入到文件file2.txt
中,如下所示:
|
|
重命名文件
在下面的案例中,将file1.txt
重命令为new_file1.txt
,如下所示:
|
|
删除文件
现在删除当前目录下的file2.txt
文件,使用的是unlink
函数,如下所示:
|
|
指定文件位置
tell
函数用于获取文件的位置,seek
函数指定文件内的位置。
tell函数
tell函数的使用如下所示:
|
|
如果指定 FILEHANDLE 该函数返回文件指针的位置,以字节计。如果没有指定则返回默认选取的文件句柄。
seek函数
seek()函数是通过文件句柄来移动文件读写指针的方式来读取或写入文件的,以字节为单位进行读取和写入,使用格式如下所示:
|
|
参数说明:
以下案例就是从文件开头读取256个字节:
使用案例
以下代码用于判断这个文件是否𥇛,是否可读写,代码如下所示:
|
|
文件测试操作符如下表所示:
操作符 | 描述 |
---|---|
-A |
文件上一次被访问的时间(单位:天) |
-B |
是否为二进制文件 |
-C |
文件的(inode)索引节点修改时间(单位:天) |
-M |
文件上一次被修改的时间(单位:天) |
-O |
文件被真实的UID所有 |
-R |
文件或目录可以被真实的UID/GID读取 |
-S |
为socket(套接字) |
-T |
是否为文本文件 |
-W |
文件或目录可以被真实的UID/GID写入 |
-X |
文件或目录可以被真实的UID/GID执行 |
-b |
为block-special (特殊块)文件(如挂载磁盘) |
-c |
为character-special (特殊字符)文件(如I/O 设备) |
-d |
为目录 |
-e |
文件或目录名存在 |
-f |
为普通文件 |
-g |
文件或目录具有setgid属性 |
-k |
文件或目录设置了sticky位 |
-l |
为符号链接 |
-o |
文件被有效UID所有 |
-p |
文件是命名管道(FIFO) |
-r |
文件可以被有效的UID/GID读取 |
-s |
文件或目录存在且不为0(返回字节数) |
-t |
文件句柄为TTY(系统函数isatty()的返回结果;不能对文件名使用这个测试) |
-u |
文件或目录具有setuid属性 |
-w |
文件可以被有效的UID/GID写入 |
-x |
文件可以被有效的UID/GID执行 |
-z |
文件存在,大小为0(目录恒为false),即是否为空文件, |
Perl目录操作
下面是Perl中常用的一些操作目录的函数:
|
|
显示所有文件
在下面的案例中,可以显示所有的文件,使用了glob
函数,如下所示:
|
|
显示当前目录下所有文件,使用opendir
函数,如下所示:
|
|
显示当前目录下所有以.pl
结尾的文件
如下所示:
|
|
创建一个新目录
mkdir也是Perl中的一个函数,它用于创建一个新目录,但是使用之前,要有足够的权限,如下所示:
|
|
删除目录
使用rmdir来删除目录,使用这个函数之前用户需要有足够的权限,如下所示:
|
|
切换目录
切换目录使用chdir函数,如下所示:
|
|
从结果来看,运行代码后,chdir并不会在shell中直接切换到/home/biotest
目录,但是,我们后来使用了opendir
函数后,显示的文件确实是/home/biotest
目录下的文件,这一点需要注意:切换目录改变的只能是Perl程序运行中的目录,而不是Shell实际中的目录。