1. 文件句柄:
Perl简单的认为文件是由一系列的字符组成。每个文件用一个文件结束标志来结束这个文件。从某种意义上来说,文件句柄类似于变量,只是它们不加任何特殊的字符前缀。因此,文件句柄通常使用大写字母出现。
事实上,有3种句柄在程序开始运行时就自动打开,分别是STDIN、STDOUT和STDERR。
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个字节长度,字节0,1和2。因而,文件中的当前位置是3,这就是一条记录的长度。
Ø seek函数
如果记录的长度已知,函数seek可用于查找文件中的任何记录。
函数seek接受3个参数:filename、offset和method。
Offset是在文件中确定新的当前位置时,所需移动的字节数。这个数一般可以这样计算:所需跳过的记录数乘以记录的字节数。
Method指出要开始查找的位置:
0表示从文件开始处计算;
1表示从当前位置开始计算;
2表示从文件结束出开始计算(这种情况下,offset一般为负数)。
例如:
seek ( FILE, 5*$length, 0 )
执行后,他会使用计算式5*$length和method为0来跳过文件的前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>