1.4 文件句柄 |
除了你模仿唯我论者哲学家编写一个人工智能程序, 你的程序使用不和外界通讯的方法。在班级例子中的第三和四行, 你将看到"GRADES", 这是引用另一个Perl文件的数据类型, 称为据柄(filehandle)。一个句柄就是你给一个文件,设备,管套(socket)或管道的一个名字, 以便帮助你记住你正处理的名字, 并隐藏某些缓存等的复杂性。(在内部, 句柄类似C++语言的流(streams), 或BASIC中的I/O通道)句柄使你从不同的地方输入和输出给不同的地方都较容易。使Perl成为好语言的一个原因是它能和多个文件通讯并一次处理他们。对外部对象有好的符号名字是一个好语言的一个组成部分[1]。
[1]其他使Perl是一个好语言的是: 它是8位的, 是可嵌入的, 你能通过扩展模式在Perl中嵌入其他程序。它是简明的,网络上容易使用。环境上是清楚的,容易对话。你能以许多不同的方法引用它(就象前面看到的)。总之,语言本身不是如此严格的结构,以至于你不能使它超出你的问题。又回到TMTOWTDI。
你创建一个句柄,并通过open函数把它和一个文件联结。open有两个参数: 句柄和你想与它联结的一个文件名。Perl也给出一些预定义(和预打开的)句柄。STDIN是你程序的正常输入通道, 而STDOUT是你程序的正常输出的通道。STDERR是一个附加的输出通道, 以便当把输入转为输出时, 程序能给出一些说明[2]。
[2]一般地, 这些句柄和你的终端联结, 所以你能输入你的程序并能看到, 但他们也可以和文件联结。Perl能给你这些预定义句柄, 因为你的操作系统已提供这些。在UNIX下, 进程从他的父进程(一般是一个shell)继承标准输入, 输出和错误。一个shell的责任之一是建立这些I/O流, 以便子进程不必考虑这些)。
既然你能为各种目的(输入, 输出, 管道)使用open函数创建句柄, 你就必须能指明你要做什么。就象在UNIX命令行一样, 你给文件名简单地加些字符。
open(SESAME, "filename"); #从已存在的文件读
open(SESAME, "<filename");#显式地,同上面
open(SESAME, ">filename"); #创建一个文件并对它写
open(SESAME, ">>filename"); #对已有的文件接着写
open(SESAME, "| output-pipe-command"); #建立一个输出过滤
open(SESAME, "input-pipe-command |"); #建立一个输入过滤
就象你看到的, 你可以任意选名字。一旦打开句柄SESAME, 它就能被用于存取文件或管道, 直到它被显式地关闭(用close(SESAME)), 或对同一句柄的一系列open把这个句柄和另一文件联结[3]。
[3]打开一个已打开的句柄是隐式地关闭第一个文件, 使它对文件句柄不可取,并打开一个不同的文件。你必须小心这是你真正想做的。有时,偶然碰巧,比如,当你open($handle,$file)时, $handle正好包含空串(null)。确认设置$handle为某个单一个量, 否则你将对空句柄打开一个新的文件。
一旦你已为输入打开一个句柄(或你使用STDIN), 你就能使用"行读操作"<>, 读一行。这个也以钻石操作闻名,因为它的形状。这个钻石操作包含你想读的句柄(<SESAME>)[4]。使用STDID句柄读用户提供的答案, 如下:
[4]空钻石操作<>, 将从命令行指定的所有文件读, 如果没有指定, 从STDIN读。(这是许多UNIX"过滤"程序的标准行为)
print STDOUT "Enter a number: "; #请求输入一个数
$number = <STDIO>; #输入一个数
print STDOUT "The number is $number"; #输出这个数
你明白我们给你的例子吗?在print语句中STDOUT做什么?这就是你使用一个输出句柄的方法之一。一个句柄可以作为print语句的第一个参数, 如果存在, 告诉往哪儿输出。在例子中,句柄是冗余的,因为输出已经是STDOUT。对于输入的缺省是STDIN, 对于输出的缺省是STDOUT。(在班级例子的18行, 我们为避免使你混淆, 我们省略了。)
我们也有一件事使你不明白。如果你试上面的例子,你可以注意到你得到一个特别的空行。因为读时没有自动地从你的输入行中删除换行符(newline)(例如, 你输入"9")。对于这些情况,当你想删除换行符时,Perl提供chop和chomp函数。chop将不加区别地删除(并返回)传给它的最后一个字符, 而chomp只删除记录标识的末尾(一般地是""), 并返回这样删除的字符数。你将经常看到这样输入一行:
chop($number = <STDIN>); #输入一个数并删除换行符
意思是:
$number = <STDIN>; #输入一个数
chop($number); #删除换行符
Copyright: NPACT |