perl学习笔记9 z

52 篇文章 0 订阅

1.  文件句柄:

Perl简单的认为文件是由一系列的字符组成。每个文件用一个文件结束标志来结束这个文件。从某种意义上来说,文件句柄类似于变量,只是它们不加任何特殊的字符前缀。因此,文件句柄通常使用大写字母出现。

事实上,有3种句柄在程序开始运行时就自动打开,分别是STDINSTDOUTSTDERR

 

2.  打开会和关闭文件句柄

使用open函数打开文件。语法如下:

 

open  ( HANDLE, ‘filename’)  or  die  (“Cannot open file: $!”)

 

参数HANDLE,是文件句柄,用于引用需要打开的文件。

参数filename,需要打开的文件名和路径信息。

如果open函数不能打开文件,将触发die命令。输出储存在特殊变量$!中保留的最后一次系统错误信息并终止程序运行。

 

程序中可以同时处理一个或多个数据文件。但每个文件都应对应唯一的文件句柄,而且,必须用一个open语句打开。

 

文件可以通过在文件名前加前缀,以多种方式中的一种打开。

 

方式

说明

<  

打开一个文件,以便读取内容

>  

打开一个文件,以便向其中写入。如果文件已存在,那么先丢弃其中的内容。

>>  

追加记录。打开或创建一个文件,以便在文件的结尾处写入新内容

+<

打开一个文件以便更新(读写)

+>

创建一个文件以便更新。如果文件存在,则丢弃其中内容

+>>

追加。打开或创建一个文件以便更新。在文件的末尾写入新内容。

 

打开一个文件句柄后,最好也显式地关闭文件句柄。语法如下:

              close  ( FILE )  or  die ( “Cannot close file: $!);

 

3.  使用文件句柄

Ø         使用<>运算符读取文件,只需将文件句柄放在<>中,当它发现一个匹配特殊变量$/的字符时,结束读取。特殊变量$/默认值为/n。如果使用<>运算符,并将一个列表作为其返回值,那么它将从文件中读取与列表中项数相同的行数。

注意:当从文件中读取数据时,记住字串中已经有了一个追尾换行符。如果要使用这些数据,最好用chomp函数移除追尾的换行符。

 

Ø         使用print函数将信息输出到一个文件句柄所分配的文件中。Print接受两个参数,第一个参数是文件句柄,第二个参数是一个字串。函数将第二个参数中的字串输出到第一个参数所指向的文件中。为了使这个语句运行,文件必须以写方式或追加方式打开。

 

Ø         print  while  ( < INFILE > ) ;

这个结构非常有用,他从文件中顺序读取数据,用存储在变量$_中的默认值来输出文件中的每一行。当<>出现在“while条件”时,文件中读取得数据赋给特殊变量$_Print函数输出特殊变量$_中的内容。直到<>符从文件获得文件结束指示。

 

Ø         使用句柄时,应注意文件句柄不能作为参数传递给函数的。有两种方法补救这个问题。一种是把文件名传递给函数。函数可以用它来创建一个本地文件句柄,然后打开。另一种方法就是使用引用。

 

4.  @ARGV特殊变量

<>运算符中没有声明任何的文件句柄时,perl就从一个称为@ARGV的特殊变量中获取文件名。这个数组变量存储所有的命令行参数,也就是在运行时提供给程序的字串。例如:

              perl  fig10_06.pl  in.txt

传递个程序的命令参数就是出现在程序正后面的数据项(或数据项列表)。

如果没有提供任何命令行参数,也就是@ARGV为空,<>将从标准输入STDIN中读取数据。如果把STDIN作为输入,那么用户必须按下“文件结束”键(在win中是ctrl+Z;在UNIX/Linux中是ctrl+D)来终止程序。

 

5.  从文件中读取数据的其它方法

<>运算符不是从文件中读取数据的唯一方法。

Ø         Read FILE, $input, 80

这个函数可以从文件FILE中读取80个字节,并将它存储在$input中。

Ø         Getc FILE

这个函数可以从FILE中读取一个字符,并返回该字符。

Ø         吞吃文件

一种方式是在“列表使用场合”下使用<>运算符,导致将文件中的每一行放入数组的每个单元中。

另一种方式是更改特殊变量$/中的值。但一定要在使用完恢复它的默认值。(local指令???

 

6.  实现一个随机访问文件

主要使用以下三个函数:

Ø         tell函数

函数tell用来确定文件中当前位置(亦即第一条记录后的那个字节)。Tell返回的值也是记录长度的字节数。

       $length = tell ( FILE );

如一条记录有3个字节长度,字节012。因而,文件中的当前位置是3,这就是一条记录的长度。

Ø         seek函数

如果记录的长度已知,函数seek可用于查找文件中的任何记录。

函数seek接受3个参数:filenameoffsetmethod

Offset是在文件中确定新的当前位置时,所需移动的字节数。这个数一般可以这样计算:所需跳过的记录数乘以记录的字节数。

Method指出要开始查找的位置:

0表示从文件开始处计算;

1表示从当前位置开始计算;

2表示从文件结束出开始计算(这种情况下,offset一般为负数)。

                           

例如:

                                          seek  ( FILE,  5*$length, 0 )

执行后,他会使用计算式5*$lengthmethod0来跳过文件的前5条记录,把第6条记录作为文件的当前位置

                    

Ø         truncate函数

truncate函数接收两个参数:一个文件句柄和一个文件字节位置。它从文件字节处开始移除记录,直到文件结束。

 

7.              无论何时,只要存在多个程序访问同一个文件的可能,就要使用flock函数限制文件的访问。有助于预防多个程序同时修改数据文件。使用flock时,尽量减少文件所定的时间。

flock  ( FILE, LOCK_EX )  or  die  ( “Could not get exclusive lock: $!”)

              flock函数有两个参数:

                     第一个参数,是文件句柄。

第二个参数,是锁定类型。Flock标识使用两种可行的锁定类型:LOCK_EX锁类型,它用排它锁来锁定文件;LOCK_UN锁定类型,它对文件进行解锁。

 

 


<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值