文件句柄 (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
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";
open (filevar, filename) filevar为文件句柄,或者说是程序中用来代表某文件的代号 filename为文件名,其路径可为相对路径,亦可为绝对路径 open(FILE1,"file1"); open(FILE1,... perl 程序通过文件句柄对文件进行文件 文件句柄相当于一个指针, 指向这个文件; 定义文件句柄有两种方式: 一种是会名称全部时大, 另一种时是定位为标量, 笔者建议句柄使用标量, 因为perl默认的文件句柄为全部大. perl 内置句柄有: STDIN, STDOUT, S...
虽然Perl 语言对目录的常见操作也提供了一组API, 如rename, rmdir, unlink 等函, 但是笔者认为并没有太大必要去花时间掌握这些函数, 因为perl 通过system 函数可以直接执行系统命令, 所以直接使用system+原生linux文件操作命令即可, 这样可以少学一套API. 因此, 笔者更常用于此种方式. 1. 获取目录下文件列表 Perl 语言获取文件列表是通过砖石...
Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读定位等操作。 下面以open函数为例: 1:读:open(文件句柄,"文件名")/open(文件句柄,"文件名"),前提文件必须已经存在,否则会返回0,出错信息在$!中。 2::open(文件句柄,">文件名"),文件如果不存在,那么创建之,如果存在,内容被清空