文件句柄
文件句柄(filehandle)就是程序里代表 perl 进程与外界之间I/O联系的名称,perl中对文件的操作都是通过文件句柄来完成的,建议句柄名都使用大写字母来命名;
其实文件句柄早就接触过,STDIN就是一个文件句柄,通过 <STDIN>来获取标准输入,perl中保留了6个特殊的文件句柄:STDIN、STDOUT、STDERR、DATA、ARGV、ARGVOUT
对文件进行操作,需要经历三个步骤:
1)打开文件
2)对文件进行读写
3)关闭文件
这三个过程都需要通过文件句柄来完成;
打开文件
打开文件需要用到 open 函数,格式如下:
open(句柄名, 操作模式+文件路径);
#句柄名不需要预先定义
#文件路径可以是相对路径也可以是绝对路径
#打开成功返回1,否则返回0
例子如下:
open(HANDLE1, "<./test.txt");#模式与路径之间可以加空格
上面的例子以只读的方式打开当前目录下的 test.txt 文件,如果成功则返回1,否则返回0;
一般来说,打开文件语句后会跟一个 die 语句用来判断是否正确打开,如下:
open(HANDLE1, "<./test.txt") or die("can't open file: $!");
如果打开失败,比如文件不存在,则会执行 die 语句,打印错误信息并且终止程序;
下表列出了不同的访问模式:
模式 | 描述 |
---|---|
< 或 r | 只读方式打开,将文件指针指向文件头 |
> 或 w | 写入方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建之 |
>> 或 a | 写入方式打开,将文件指针指向文件末尾,如果文件不存在则尝试创建之 |
+< 或 r+ | 读写方式打开,将文件指针指向文件头 |
+> 或 w+ | 读写方式打开,将文件指针指向文件头并将文件大小截为零,如果文件不存在则尝试创建之 |
+>> 或 a+ | 读写方式打开,将文件指针指向文件末尾,如果文件不存在则尝试创建之 |
读写文件
读取文件的一般格式如下:
open(HANDLE1, "<./test.txt") or die("can't open file: $!");
while(<HANDLE1>)#通过钻石操作符来读取文件的每一行
{
chomp;
say($_);#打印文件的每一行
}
close(HANDLE1);
#对于小文件,也可以通过数组来一次性接收所有文件而不需要使用循环,如下:
my @arr = <HANDLE1>;
#也可以在while 循环体中继续读取文件,如下:
while(<HANDLE1>)#遍历奇数行1 3 5...
{
chomp;
say($_);#打印文件的每一行
my $line = <HANDLE1>;#读取偶数行2 4 6...
}
从特殊文件句柄,如<STDIN>、<>、<ARGV>读取数据时,由于它们是预定义好的,所以不需要open;
写入文件,需要用到 输出函数 say/print/printf ,当写入多行内容时可以使用 heredoc;
写入文件使用输出函数时,在这几个函数后加上文件句柄表示将输出语句写入到文件句柄中,如果不加文件句柄则默认的句柄为 STDOUT,也就是输出到显示器;写入文件的一般格式如下:
open(HANDLE1, ">>./test.txt") or die("can't open file: $!");
say(HANDLE1 "hello perl");
print(HANDLE1 "hello python");
say(HANDLE1 <<EOF
hi this is a heredoc
EOF
);
close(HANDLE1);
注意,在用 say 写入时默认会写入换行符,而print 写入时不会写入换行符,这与二者的输出格式是一致的;此外,上面的写入方式都会在原文件的基础上另起一行写入!!
关闭文件
文件在读写完成后,需要关闭,这需要用到 close 函数,格式如下:
close(FILEHANDLE);
操作文件指针
perl在操作文件指针时,可以用 seek 函数移动文件指针,格式如下:
seek (filevar, distance, relative_to);
seek可以改变文件指针的位置,有三个参数:
1)filevar 文件句柄
2)distance 移动的字节数,正数向前移动,负数往回移动
3)relative_to 可以为0/1/2 0表示相对于文件头移动,1表示相对于当前位置移动,2表示相对于文件末尾移动
seek 函数有返回值,移动成功返回真,否则返回假;seek 一般和 tell一起使用,tell用来返回当前文件指针的位置,格式如下:
tell(filevar);
tell 的返回值为从文件头到当前位置的距离,单位为字节;
perl 文件操作符
perl 语言提供了很多对于判断文件属性的操作符, 笔者只列出个人常用的一些文件操作符. 文件属性判断操作符通常与if 配合使用;
1)判断文件权限
测试操作符 | 含义 |
---|---|
-r | 当前用户对此文件是否拥有可读权限 |
-w | 当前用户对此文件是否拥有可写权限 |
-x | 当前用户对此文件是否拥有可执行权限 |
-o | 此文件所有者是否是当前用户 |
2)判断文件类型
测试操作符 | 含义 |
---|---|
-f | 文件是否是普通文件 |
-d | 文件是否是目录文件 |
-l | 文件是否是链接文件 |
3)判断文件存在
测试操作符 | 含义 |
---|---|
-e | 文件或目录存在 |
-z | 判断文件内容为空,不能用于判断目录 |
-s | 判断文件或目录存在, 返回文件或目录的大小, 单位为字节 |
文件操作符组合
通常我们可能会对同一个文件的多个属性进行判断, 那么就需要组合文件操作符;
1)逻辑表达式组合
- perl 可以使用and 和 or 表示逻辑与和逻辑或的关系
-
隐式文件句柄 _ 表示上次监测的文件, 用于提升效率
如下例子:
if ( -f $file and -x _ )
{
print “文件$file 存在且可执行\n”;
}
2)栈式组合
栈操作符只能表示逻辑与关系, 使用起来很方便, 代码写起来会更精简:
if( -f -x $file){
print "文件$file 存在且可执行\n";
}
glob函数
glob()函数用于打印作为参数传递给它的目录中存在的文件,语法如下:
glob(Directory_name/File_type)
参数:要打印文件的目录的路径
返回值:给定目录中存在的文件列表
看下面例子:
@files = glob('C:/Users/GeeksForGeeks/Folder/*'); #打印 Forder 目录下的所有文件
# Printing the created array
print "@files\n";
@Array = glob('C:/Users/GeeksForGeeks/Folder/*.txt'); #打印 Forder 目录下所有以 txt 结尾的文件
print "@files\n";