perl句柄

perl文件句柄是重要的操作,所谓的文件句柄实际是文件描述符的高级包装,我个人倾向于其是将文件和句柄联系起来。
pelr的句柄包括文件句柄和目录句柄。
一、文件句柄
从文件句柄方面,我想从三个方面讲解,文件句柄的一般应用,文件句柄的类型,文件句柄的高级操作三个方面进行讲解
首先,文件句柄的建立分为三操作符和二操作符
三操作符:

open my $fh, '<', 'file.txt' or die $!; ... close $fh;
open my $fh, '>', 'file.txt' or die $!; ....  close $fh;
open my $fh, '>>', 'file.txt' or die $!; ... close $fh

二操作符:

open my $fh, '<file.txt' or die $!;
open my $fh, '>file.txt' or die $!;
open my $fh, '>>file.txt' or die $!;

所谓的die $!;是如果操作系统打开句柄有问题,会将错误放置在!中并退出 其次,一般应用在哪里? 通过读取操作,我们将文件和句柄联系起来,实现文件的读取。而文件的读取,我们可以通过readline `fh, <$fh>这两种方式实现,但现在主要是通过<$fh>实现,因为比较简单。那么<$fh>是怎么实现的呢?这是根据<$fh>所在的上下文决定,如果<$fh>是在标量上下文,则读取下一行的文件;如果<$fh>是在列表上下文的话,则一次性读取所有文件;如果<$fh>是在空上下文的话,则丢弃该数据
我们举例来说

1
2
3

line=<fh>;
则第一次是读取1,如果line2=<fh>,那么读取2
@line=<fh>;则数组就是@line=(1,2,3 <fh>;空上下文读取1,然后丢弃,下次再读取从2开始。
那么通过这个<$fh>所处在的上下文的情况就可以实现文件的读取,最常用的操作就是在标量的while上下文,

open my $fh, '<', 'file.txt' or die $!;
while my $line (<$fh>){
 print “$line\n”;
}

这样循环读取文件内容。
尽量不要放在列表上下文,因为如果你文件的数据量太大的话,一次性读取花费内存太大。比如下面这种方式也能读取,但不建议:

open my $fh, '<', 'file.txt' or die $!;
foreach my $line(<$fh>){
  print "$line\n";
}

这样也实现了读取。
还有就是readline也可以的和钻石操作符实际上一样的。
这里既然提到了钻石操作符,就接着讲解一下,钻石操作符的用法实际有4种吧。
用法1:<$fh>当做文件句柄
用法2:<>什么都没有,但是如果有命令行参数文件,等价与<ARGV>
用法3:<>什么都没有,但是后面没有命令行参数,等价于<STDIN>标准输入。
用法4:<"*">代表通配符,等价glob()
文件句柄的类型
现在实际已经将裸字文件句柄改为标量句柄,此外还有一些perl内置的文件句柄,包括STDIN、STDOUT、STDERR、ARGV、DATA。
STDIN标准输入:标准输入还是有一些简单的用法,比如1.pl脚本如下

while(<STDIN>){
  chomp;
  say $_;
}

如果perl 1.pl这个脚本,那么就代表从标准输入获取文件
ARGV:代表命令行文件的文件句柄:
perl 1.pl 1.txt 2.txt 这个时候还是要弄清楚@ARGV, ARGV[n],ARGV, ARGV。
@ARGV就是命令行参数的数组文件,包含了1.txt 和2.txt
ARGV就是当前正在当做文件句柄的文件 ARGV就是文件句柄。 可以这样理解,perl 1.pl 1.txt 2.txt 将@ARGV数组包含两个元素,然后移除一个元素,与ARGV句柄联系一块,其作为当前正在读取的文件句柄ARGV
文件句柄的高级操作
● 文件句柄内部也支持管道,使得文件句柄能与外部管道进行交互。那么还是分两种,一种是外部shell通过管道传递而文件句柄,另一种是文件句柄的内容通过管道交给外部的shell命令。二者的分号分别是-|和|-
open my fh, "-|", "cat", "-n",file
open my fh, "|-", "cat", "-n",file
● 设置可写的情况,+< +>+>>
这里讲解一个关于打开open my file, '+<', undef or die!;
这样设置一个undef为空的文件,那么这个文件会在/tmp目录下,并且在创建的核实后就删除了,就是你找不到文件,但是因为文件句柄存在,perl会一直拥有这个文件句柄,一直到这个内容消失。这样做的好处是一般是防止一些人误打开句柄,更好的保密处理和进行信息的交换
● 复制文件句柄,实现多个文件的重定向类似 &>FILENAME 或者 >FILENAME 2>&1

open my $oldout, ">&STDOUT" or die $!;
open my $olderr, ">&STDERR" or die $!;
#保存STDOUT和STDERR到$oldout和$olderr中
open STDOUT, '>', "tmp.txt" or die $!;
open STDERR, '>&STDOUT' or die $!;
#将标准输出和标准错误都定向到tmp.txt二、目录句柄
通过上面实际可以了解到,文件句柄是对文件进行操作。如果我们想查看某目录内所有文件名字怎么办?我们可以通过打开目录句柄,操作某目录内的文件,实际是基本上是拿到名字。
● opendir DIR, "." or die $!;
● readdir DIR可以获取该目录句柄中文件,和readline 类似,当readdir DIR在标量上下文的时候读取下一个文件名字,当在列表上下文时候获取所有的文件名字。
所以我们可以依次获取目录中的文件名字

while(readdir DIR){
say;
}
for my $file(readdir DIR){
。...
}

while(readdir DIR){
 say;
}
for my $file(readdir DIR){
。...
}


open STDOUT, '>&', $oldout or die $!;
open STDERR, ">&", $olderr or die $!;

直接粘贴的语法太乱了,懒得该了

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

推荐阅读更多精彩内容