perl文件操作

文件句柄

文件句柄(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";

  • 1
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值