找回密码
 注册
查看: 5154|回复: 0

perl语言中的文件句柄

[复制链接]
发表于 2011-11-13 23:00:07 | 显示全部楼层 |阅读模式
文件句柄(filehandle)是Perl 程序I/O 连接的名字,是Perl 和外界的纽带。也就是说,它是连接的名字,而非文件的名字。
文件句柄的命名规则和Perl 中其它标识符一样(由字母,数字,下划线组成,但不能由数字开头);由于没有任何的前缀符,
这可能和现在或者将来的保留字,标签混淆。因此,和标签一样,Larry 推荐文件句柄的所有字母均大
写。这有利于阅读,并且能保证程序在引入新的保留字(小写)后仍能正确执行。
Perl 自身有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT◆。虽然可以任意给文件句柄命名,
但不能选择上面六个,除非你想利用它们的某些特殊性质◆。
◆有些人不喜欢使用全部大写的字符串,他们喜欢使用小写字母,如stdin。Perl 可能让它正确执行,但这并非是普适的。它们在何时正确
执行,何时会失败不在本书讨论范围之内。需要指出的是,如果你的程序依赖这种性质,即便它现在能正确执行,也很可能在将来的某
一天失败,因此最好避免使用小写的形式。
◆某个情况下,这要使用不会有任何问题。当你的维护人员可能会混淆。
你可能还记得其中一些句柄的名字。当程序运行时,STDIN 连接Perl 当前处理的部分和其他输入来源,其一般被称作标准
输入流。通常,是指键盘,除非指定了别的输入源,如文件或者另一个程序的输出,通过管道(pipe)◆。STDOUT 是标准
输出流。默认情况,这是指用户的显示屏,但可以将其输出到文件,或者另一个程序中,我们将很快看到。这些标准流来
源于Unix 的标准I/O 库,但它们在大多数的当代操作系统◆中都能正确工作。一般的思想是,程序只是从STDIN 读入,
写出到STDOUT,相信用户(或者启动此程序的程序)能正确地设定。由于上述原因,用户就可以在shell 提示符中输入如
◆本章中我们讨论的3 种主要的I/O 流是Unix shell 默认情况下使用的。但不是只有shell 能调入程序。我们在第十四章中讨论当由Perl 调
入时将发生什么事。
◆如果不熟悉你的Non-Unix 系统提供的标准输入输出设备,可以参看perlport 的帮助手册,来查看其和Unix shell(运行程序的程序,依
赖于键盘的输入)的等价物。
$ ./your_program <dino >Wilma
上述命令告诉shell,从一个名叫dino 读入,将结果输出到叫做wilma 的文件之中。由于程序从STDIN 读入,处理它(按
照我们的要求),再输出到STDOUT,上述代码将能很好工作。
不需要额外的代价,上述程序能很好的在管道中使用。这是Unix 的另一个概念,可以让我们如下的写命令:
$ cat fred barney | sort | ./your_program | grep something | lpr
如果你不熟悉Unix 命令,也不要紧。上面一行的含义是:cat 命令将输出文件fred 的所有行,紧接着是文件barney 的所有
行。这个输出作为sort 的输入,它将所有的输入的行进行排序,再将结果传递给your_program。经过your_program 处理后,
将结果传给grep,它会将某些行去除掉,然后送给lpr,它会将传给它的数据打印出来。
像上面那样的管道命令在Unix 和许多别的系统中非常常见,因为它们可以让你通过简单的,标准命令创建强大的,复杂的
命令。每一个小的命令完成一件事情,你的任务就是准确地组合它们。
还有一种标准的I/O 流。如果your_program 有警告(warnings)或者诊断(diagnostic)信息,这些信息不应当在管道中传递。grep
命令可以去掉任何没有特别指定的信息,因此很可能去掉了warnings。即便它保留了这些warnings,你很可能不希望把这
些信息在管道中传递下去。这就是为什么还有标准错误流的原因:STDERR。标准输出可以输出到另一个程序或者文件,
错误可以输出到用户指定的任何地方。默认情况下,错误将输出到用户的显示屏◆,但用户可能把错误输出到文件中,如
下面的命令:
◆通常,错误是不会被缓存的。这就使说,如果标准输出流和标准错误都是输出到同一个地方(如显示器),则错误通常会出现在普通输
出的前面。例如,你的程序输出普通文件的一行,和除以0,则通常会先显示除以0 的(错误)信息,然后才是文件的内容。
$netstat | ./your_program 2>/tmp/my_errors
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-23 20:35 , Processed in 0.029509 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表