Perl的open函数

摘要:
函数binmode调用语法:binmode;当你的系统对文本文件和二进制文件有所区别时使用.必须在打开文件后,读取文件前使用.5.写入文件写入文件通常用print,printf和write这三个函数.print是这三个函数中最简单的,它向指定的文件输出,如果未指定,则输出到当前缺省文件中.如:print("Hello,there!

引自 http://blog.csdn.net/stonesharp/article/details/6744634

一.文件操作
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 ");
}
亦可用逻辑或操作符表示如下:
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. ");
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. ");
@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! ");
print OUTFILE ("Hello, there! ");
第一句输出到当前缺省文件中,若未调用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中文件变量参数可使用表达式。

免责声明:文章转载自《Perl的open函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Asp.Net 4.0 新特性之 使用自定义OutputCache ProviderNode.JS + MongoDB技术浅谈下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RPC(Remote Procedure Calls)远程过程调用

很长时间以来都没有怎么好好搞清楚RPC(即Remote Procedure Call,远程过程调用)和HTTP调用的区别,不都是写一个服务然后在客户端调用么?这里请允许我迷之一笑~Naive!本文简单地介绍一下两种形式的C/S架构,先说一下他们最本质的区别,就是RPC主要是基于TCP/IP协议的,而HTTP服务主要是基于HTTP协议的,我们都知道HTTP协...

Reactv16.8.6生命周期函数

组件生命周期函数 React 主动调用的方法,也可重写这些方法 生命周期图谱 当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下: constructor(props) 如果不需要初始化 state 或 不进行方法绑定,则不需要使用该方法 在组件挂载之前会先调用该方法,在实现构造函数时必须先调用super(props)方法,否则会出现BUG通常,...

MFC之目录结构及消息流转(一)

跟上时代,用vs2010, 新建一个MFC应用程序Helloworld。 目录结构: 所有文件分为6个部分:解决方案相关文件、工程相关文件、应用程序头文件和源文件、资源文件、预编译头文件和编译链接生成文件。        1.解决方案相关文件        解决方案相关文件包括解决方案文件夹下的.sdf文件、.sln文件、.suo文件和ipch文件夹。  ...

Win32汇编操作注册表

1.打开和关闭子键 注册表函数对注册表的操作是通过句柄来完成的,与文件操作一样,在对某个键下的子键或者键值项进行操作之前,需要先将这个键打开,然后使用键句柄来引用这个键,在操作完毕以后再将键句柄关闭。注册表的根键不需要打开,它们的句柄是固定不变的,要使用根键的时候只要把这些句柄直接拿来用就是了,Windows.inc中已经预定义了它们的数值: HKEY_C...

Linux系统编程 —时序竞态

时序竞态 什么是时序竞态?将同一个程序执行两次,正常情况下,前后两次执行得到的结果应该是一样的。但由于系统资源竞争的原因,前后两次执行的结果有可能得到不一样的结果,这个现象就是时序竞态。 pause函数 函数原型: int pause(void); 函数作用: 进程调用pause函数时,会造成进程主动挂起(处于阻塞状态,并主动放弃CPU),并且等待信号将其...

Linux 异步IO(AIO)

目录 1.select和poll 2. BSD异步IO 3. POSIX异步IO(AIO) 3.1 AIO控制块 3.2 aio_read & aio_write 3.3 aio_fsync 3.4 aio_error 3.5 aio_return 3.6 aio_suspend 3.7 aio_cancel 3.8 lio_listio...