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 $!
;是如果操作系统打开句柄有问题,会将错误放置在fh
, <$fh>这两种方式实现,但现在主要是通过<$fh>实现,因为比较简单。那么<$fh>是怎么实现的呢?这是根据<$fh>所在的上下文决定,如果<$fh>是在标量上下文,则读取下一行的文件;如果<$fh>是在列表上下文的话,则一次性读取所有文件;如果<$fh>是在空上下文的话,则丢弃该数据
我们举例来说
1
2
3
fh>;
则第一次是读取1,如果fh>,那么读取2
@line=<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, ARGV。
@ARGV就是命令行参数的数组文件,包含了1.txt 和2.txt
ARGV
文件句柄的高级操作
● 文件句柄内部也支持管道,使得文件句柄能与外部管道进行交互。那么还是分两种,一种是外部shell通过管道传递而文件句柄,另一种是文件句柄的内容通过管道交给外部的shell命令。二者的分号分别是-|和|-
open my file
open my file
● 设置可写的情况,+< +>+>>
这里讲解一个关于打开open my !;
这样设置一个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 $!;
直接粘贴的语法太乱了,懒得该了