分类:
2010-11-05 15:53:18
文件操作
1.打开、关闭文件
若要在perl中读取或者写文件,必须打开一个文件的句柄(另一种类型的变量)。句柄包含了关于如何打开文件和你在文件中读(或写)到了什么位置等信息。还包含了用户定义的如何读写文件的属性。每当需要风闻磁盘上的文件时,必须创建一个新的文件句柄,并且打开该文件句柄。open函数打开文件句柄。句柄命名的时候最好使用大写字母,以示区分。
open():
open(filehandle,pathname)
open函数将文件句柄作为它的第一个参数,将路径名作为第二个参数。如果open函数运行成功,返回一个非0值,否则返回undef(假),如:
if(open(myfile,"mydatafile")){
}else{
print "can not open mydatafile!\n";
exit 1;
}
当文件打开失败时结束程序:
unless (open (MYFILE, "file1")) {
die ("cannot open input file file1\n");
}
亦可用逻辑或操作符表示如下:
open (MYFILE, "file1") || die ("Could not open file");
当文件操作完毕后,用close(MYFILE); 关闭文件。
在windows和MS-DOS系统中,为了防止路径中的\在""中被解释为转义符而出现错误,应该使用\\或者正斜杠/。如:
open(MYFILE,"c:\\windows\\users\\pierce\\novel.txt")||die("can not open the file!");
open(MYFILE,"c:/windows/users/pierce/novel.txt")||die("can not open the file!");
perl能够打开网络文件:
open(REMOTE,"//fileserver/common/foofile")||die;
die函数
可以用来在出现错误的时候停止解释程序的运行,并输出一条有意义的出错消息。只要调用die函数,就能够输出类似下面的消息:
Died at scriptname line xxx
特殊变量$!
它总是设置为系统需需要的最后一个操作的出错消息。如:
open(MYFILE,"mtfile")||die("can not open myfile:$!\n");如果文件不存在,输出:"can not open myfile:a file or directory in the path does not exist.
只有当系统执行某一操作,且该操作失败后,$!才被设置!
warn函数(不中断程序的运行)
if(!open(MYFILE,"mydata")){
warn "can not read mydata:$!";
}else{
:
}
2.读取文件
文件输入运算符(<>)
open(MYFILE,"myfile")||die "cannot open myfile:$!";
$line=
尖括号运算符<>能够读取来自文件的一行输入,当该文件被读完时,返回undef。一行输入是指windows和MSDOS中回车符或换行符之前的文本流.
若要读取并输出整个文件,可以使用下列代码:
while(defined($a=
print $a;
}
注意:perl中用文件句柄读取的所有数据中,除了包含本文外还包含行尾字符,如果只要文本,应该使用chomp函数,以便舍弃行尾字符。
也可使用列表来储存整个文件数据,如:
open(myfile,"novel.txt")||die "$!";
@contents=
close(myfile);
这样文本中的第一行被赋予@contents:$contents[0],第二行被赋予@contents:$contents[1],等等.实例:
#!/usr/bin/perl
open(myfile,"d:/data.txt")||die"$!";
@contents=
close(myfile);
foreach(reverse(@contents)){
print scalar(reverse($_));
}
#lareneg-rojam nredom a
# fo ledom yrev eht ma I
3.写文件
open(filehandle,">pathname"); 打开文件,并准备覆盖现有文件数据
open(filehandle,">>pathname"); 打开文件,并准备追加现有文件数据
只有close了文件句柄,才真正的写入数据到文件中。
将数据写入文件句柄的方法:
print filehandle list; list是要写入的数据的列表,如:
open(LOGF,">>logfile")||die "$!";
if(!print LOGF "This entry was written at",scalar(localtime),"\n"){
warn "Unable to write to the log file: $!";
}
close(LOGF);
二进制数据:binmode(filehandle),将文件句柄改成二进制模式,这样进行读写。
open(FH,"camel.gif")||die"$!";
binmode(FH);
print FH "GIF\87a\056\001\045\015\000";
close(FH);
语法为:-x filehandle|pathname,如:
if (-e "/path/file1") {
print STDERR ("File file1 exists.\n");
}
4.文件测试操作符
操作符 描述
-b 是否为块设备
-c 是否为字符设备
-d 是否为目录
-e 是否存在
-f 是否为普通文件
-g 是否设置了setgid位
-k 是否设置了sticky位
-l 是否为符号链接
-o 是否拥有该文件
-p 是否为管道
-r 是否可读
-s 是否非空
-t 是否表示终端
-u 是否设置了setuid位
-w 是否可写
-x 是否可执行
-z 是否为空文件
-A 距上次访问多长时间
-B 是否为二进制文件
-C 距上次访问文件的inode多长时间
-M 距上次修改多长时间
-O 是否只为“真正的用户”所拥有
-R 是否只有“真正的用户”可读
-S 是否为socket
-T 是否为文本文件
-W 是否只有"真正的用户"可写
-X 是否只有"真正的用户"可执行
注:“真正的用户”指登录时指定的userid,与当前进程用户ID相对,命令suid可以改变有效用户ID。
例:
unless (open(INFILE, "infile")) {
die ("Input file infile cannot be opened.\n");
}
if (-e "outfile") {
die ("Output file outfile already exists.\n");
}
unless (open(OUTFILE, ">outfile")) {
die ("Output file outfile cannot be opened.\n");
}
等价于
open(INFILE, "infile") && !(-e "outfile") &&
open(OUTFILE, ">outfile") || die("Cannot open files\n");
5.命令行参数
象C一样,PERL也有存储命令行参数的数组@ARGV,可以用来分别处理各个命令行参数;与C不同的是,$ARGV[0]是第一个参数,而不是程序名本身。
$var = $ARGV[0]; # 第一个参数
$numargs ; # 参数的个数
PERL中,<>操作符实际上是对数组@ARGV的隐含的引用,其工作原理为:
1、当PERL解释器第一次看到<>时,打开以$ARGV[0]为文件名的文件;
2、执行动作shift(@ARGV); 即把数组@ARGV的元素向前移动一个,其元素数量即减少了一个。
3、<>操作符读取在第一步打开的文件中的所有行。
4、读完后,解释器回到第一步重复。
例:
@ARGV = ("myfile1", "myfile2"); #实际上由命令行参数赋值
while ($line = <>) {
print ($line);
}
将把文件myfile1和myfile2的内容打印出来。
6.打开管道
用程序的形式也可以象命令行一样打开和使用管道(ex:ls > tempfile)。如语句open (MYPIPE, "| cat >hello"); 打开一个管道,发送到MYPIPE的输出成为命令"cat >hello"的输入。由于cat命令将显示输入文件的内容,故该语句等价于open(MYPIPE, ">hello"); 用管道发送邮件如下:
open (MESSAGE, "| mail dave");
print MESSAGE ("Hi, Dave! Your Perl program sent this!\n");
close (MESSAGE);