犯了个汗颜的错误。。在使用perl里的open函数时,觉得如果用户没有权限打开文件,则会抛出异常。。无语。。学java学到傻了。perl事实上跟C有点相似,打开会返回非0,打不开会返回0而已。。。
以下是拷贝自
一.文件操作
1.打开文件
用open函数可将文件句柄与某文件联系起来,提供访问文件的接口,即打开文件.
语法为:
open(FILEVAR, "filepath");
filepath可以有如下三种模式:
"filepath" 以只读模式打开文件.
">filepath" 以写模式打开文件.
">>filepath" 以追加模式打开文件,写和追加的区别在于写模式将原文件覆盖,而追加模式则在文件末尾处添加内容.
"+>filepath" 以读和写方式打开文件.
"+>>filepath" 以读和追加方式打开文件.
open的常见用法如下:
if (open(MYFILE, "myfile"))
{
# here's what to do if the file opened successfully
}
当文件打开失败时结束程序
unless (open (MYFILE, "file1"))
{
die ("cannot open input file file1\n");
}
亦可用逻辑或操作符表示如下:
open (MYFILE, "file1") || die ("Could not open file");
2.打开管道
用open函数也可像命令行一样,打开和使用管道.
语法为:
open(MYVAR, "mode");
mode有如下两种模式:
"|command" 表示对MYVAR的输出相当于对command的输入.
"command|" 表示command的输出作为对MYVAR的输入.
例如:
open(FILE1, "who|") or die("Could not open file.\n");
while ($line = )
{
print $line;
}
3.文件重定向
许多UNIX shell可以把标准输出文件(STDOUT)和标准错误文件(STDERR)都重定向到同一个文件.
例如在BASH中,命令`$ foo > file1 2>&1`把输出到标准输出和标准错误的内容存贮到文件file1中.
用open函数可以实现文件重定向.
如以上命令可以用如下命令实现:
open (STDOUT, ">file1") || die ("open STDOUT failed");
open (STDERR, ">&STDOUT") || die ("open STDERR failed");
4.读取文件
语句$line = ;从文件中读取一行数据存储到简单变量$line中并把文件指针向后移动一行.
语句@array = ;把文件的全部内容读入数组@array,文件的每一行(含回车符)为@array的一个元素.
注:为标准输入文件,通常为键盘输入,不需要打开.
例如:
open(FILE1, "testfile") or die("Could not open file.\n");
@line = ;
foreach $message (@line)
{
print $message;
}
此外perl还提供以下几个系统读函数.
函数read
调用语法:
read (filevar, result, length, skipval);
read函数设计得与UNIX的fread函数等效,可以读取任意长度的字符存入一个简单变量.
filevar表示文件变量
result表示存贮结果的简单变量
length表示读取的字节数
skipval(可选项),指定读文件之前跳过的字节数.
返回值为实际读取的字节数,如果已到了文件末尾,则返回零.如果出错,则返回空串.
函数sysread
调用语法:
sysread (filevar, result, length, skipval);
更快的读取数据,与UNIX函数read等效,参数与read相同.
函数getc(读取单个字符)
调用语法:
$char = getc (infile);
从文件中读取单个字符。
函数binmode(读取二进制文件)
调用语法:
binmode (filevar);
当你的系统(如类DOS系统)对文本文件和二进制文件有所区别时使用.必须在打开文件后,读取文件前使用.
5.写入文件
写入文件通常用print,printf和write这三个函数.
print是这三个函数中最简单的,它向指定的文件输出,如果未指定,则输出到当前缺省文件中.
如:
print ("Hello, there!\n");
print OUTFILE ("Hello, there!\n");
第一句输出到当前缺省文件中,若未调用select,则为STDOUT.
第二句输出到由文件变量OUTFILE指定的文件中.
printf函数先格式化字符串再输出到指定文件或当前缺省文件中.
如:
printf OUTFILE ("you owe me %8.2f", $owing);
此语句取出变量$owing的值并替换掉串中的%8.2f,%8.2f是域格式的例子,把$owing的值看作浮点数.
printf的域格式表如下:
%c 单个字符
%d 十进制整数
%e 科学计数法形式的浮点数
%f 普通形式(定点)浮点数
%g 紧缩形式浮点数
%o 八进制整数
%s 字符串
%u 无符号整数
%x 十六进制整数
域格式的注意事项:
A.在格式d,o,u或x中,如果整数值较大或可能较大,可加个l字符,意为长整型,如%ld.
B.%字符后加正整数表示该域的最小宽度,如果宽度不足,则向右对齐,前面用空格补足.如果该正整数以数字0打头,则补足字符为0.若%字符后为负整数,则结果向右对齐.
C.浮点数域值(%c,%f和%g)中可以指定小数点前后的宽度,如%8.3f意为总宽度为8个字符,小数点后(即小数部分)为3个字符,多出的小数部分四舍五入.
D.在整数,字符或字符串的值域中使用如上的小数形式n.m,n为总宽度,m为输出结果的最大宽度,这样就保证了输出结果前至少有n-m个空格.
write函数使用输出格式把信息输出到文件中.
此外perl还提供以下系统写函数.
函数syswrite
调用语法:
syswrite (filevar, data, length, skipval);
更快的写入数据,与UNIX函数write等效.
filevar:将要写入的文件
data:存贮要写入数据的变量
length:要写入的字节数
skipval写操作之前跳过的字节数
最后注意:
有些操作系统在对文件写入数据时,会先把数据拷贝到一片特殊的内存即缓冲区中,接下来的输出操作继续写入缓冲区直到写满.当缓冲区满了,就把全部数据实际写入.
象这样先写入缓冲区再把整个缓冲区的内容输出比每次都实际输出所花费的时间要少得多,因为一般来说,I/O比内存操作慢得多.
在perl中,如果要使当前缺省文件的输出不进行缓冲,可对$|赋一个非0值.
select (OUTFILE);
$| = 1;
这样就关闭了对OUTFILE文件写入的缓冲.
6.关闭文件
close函数可用来关闭已打开的文件.
当用close关闭管道,即重定向的命令时,程序等待重定向的命令结束.
如:
open (MYPIPE, "cat file*|");
close (MYPIPE);
当关闭此文件变量时,程序暂停运行,直到命令cat file*运行完毕.
7.select函数
select函数将通过参数传递的文件变量指定为新的当前缺省文件.
如:
select (MYFILE);
这样,MYFILE就成了当前缺省文件,当对print,write和printf的调用未指定文件时,就输出到MYFILE中.
8.eof函数
eof函数查看最后一次读文件操作是否为文件最后一个记录.如果是,则返回非零值;如果文件还有内容,返回零.
一般情况下,对eof的调用不加括号,因为eof和eof()是等效的.但与<>操作符一起使用时,eof和eof()就不同了.
9.文件定位
tell函数和seek函数配合使用,可轻松实现文件内部的定位.
tell函数的调用格式如下:
tell (filevar);
用于返回从文件头到当前位置的距离。
seek函数的调用格式如下:
seek (filevar, distance, relative_to);
distance表示移动的字节数,正数向前移动,负数往回移动.
reletive_to的值可为0,1或2.为0时,从文件头开始移动;为1时,相对于当前位置移动;为2时,相对于文件末尾移动.
命令运行成功返回真,失败则返回零.
注意:
A.seek和tell不能用于指向管道的文件变量。
B.seek和tell中文件变量参数可使用表达式。