文件句柄
:Perl进程与外界之间的IO联系的名称。
在Perl5.6之前,所有文件句柄名称都是裸子,之后可以把文件句柄的引用放在常规变量中。
6个特殊文件句柄名是Perl保留的,STDIN、STDOUT、STDERR、DATA、ARGV、ARGVUT。
用户可以在shell里运行以下命令:
$./my_program <dino >wilma; #告诉shell,程序的输入应该来自dino,输出应该送到wilma文件。
打开文件句柄
三种perl默认文件句柄---STDIN、STDOUT、STDERR,是产生Perl进程的父进程自动打开的文件或设备。
open Filehandler,filename;
open CONFIG,'dino';#打开已存在的dino文件,文件中的任何内容都可以读到我们的程序中
open CONFIG,'<dino';#用小于号声明该文件只是用来读入,而非写入
open BEDROCK,‘>fred’;#大于号,打开文件句柄,并输出到新文件fred中,如果已存在fred,则清除原内容并以新内容取代之;
open LOG,'>>logfile';#双大于号,打开文件,如果文件原本就存在,那么新数据会添加在原有内容后面,如果不存在,会创建一个新文件。
open CONFIG,'<','dino';
open BEDROCK,'>',$file_name;
open LOG,'>>','logfile';
open CONFIG,'<:encoding(UTF-8)','dino';##open CONFIG,'<:utf8','dino';
简写方式不会考虑输入或输出的数据是否真的就是合法的UTF-8字符串,如果是encoding(UTF-8),会确认编码是否正确。
%perl -MEncode -le "print for Encode->encodings(':all')"#打印出所有Perl能理解和处理的字符编码;
使用文件句柄
print LOG “Captain‘s log,stardate 3.14159\n”;
printf STDEER "%d percent complete.\n",$done/$total*100;
printf (STDEER "%d percent complete.\n",$done/$total*100);
printf STDEER ("%d percent complete.\n",$done/$total*100);
改变默认文件输出句柄
select BEDROCK;#改变输出用的默认文件句柄
print “i hope Mr.Slate doesn't find out about this.\n”;
select STDOUT;#选择默认的输出句柄
用say来输出
Perl5.10开始可以使用say,在打印每行内容时会自动加上换行符。
use 5.010;
say “Hello!”;#等价于print “Hello!\n”;
say BEDROCK "hello!";#为say指定一个文件句柄
$name = 'fred'
say $name; #等价于print $name,"\n";
my @array = qw {a b c d};
say @array; #打印abcd\n
say "@array"#打印a b c d\n
标量变量中的文件句柄
my $rocks_fh;
open $rocks_fh,'<','rocks.txt' or die "Could not open rocks.txt:$!";
while(<rocks_fh>){
chomp;
....
}
close $rocks_fh;
返回文件句柄
:1、使用\*;
#!/usr/bin/perl
use strict;
sub openfile()
{
my $path=shift;#把数组的第一个值移出并返回它,然后把数组长度减一并把所有的东西都顺移
open(FILE,"$path") or die "Can't open $path $!\n ";
return \*FILE;
}
my $temp=&openfile("config");
my @file=<$temp>;
print @file;
2、使用变量
#!/usr/bin/perl
use strict;
sub openfile()
{
my $file;
my $path=shift;
open($file,"$path") or die "Can't open $path $!\n ";
#close($file);
return $file;
}
my $temp=&openfile("config");
my @file=<$temp>;
print @file;