Perl文件句柄详解

在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即Perl文件句柄(filehandle),该Perl文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将Perl文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,在通过调用系统函数来关闭该文件。

除了你模仿唯我论者哲学家编写一个人工智能程序,你的程序使用不和外界通讯的方法。在班级例子中的第三和四行,你将看到"GRADES",这是引用另一个Perl文件的数据类型,称为据柄(filehandle)。一个句柄就是你给一个文件,设备,管套(socket)或管道的一个名字,以便帮助你记住你正处理的名字,并隐藏某些缓存等的复杂性。(在内部,句柄类似C++语言的流(streams),或BASIC中的I/O通道)句柄使你从不同的地方输入和输出给不同的地方都较容易。使Perl成为好语言的一个原因是它能和多个文件通讯并一次处理他们。对外部对象有好的符号名字是一个好语言的一个组成部分[1]。

其他使Perl是一个好语言的是:它是8位的,是可嵌入的,你能通过扩展模式在Perl中嵌入其他程序。它是简明的,网络上容易使用。环境上是清楚的,容易对话。你能以许多不同的方法引用它(就象前面看到的)。总之,语言本身不是如此严格的结构,以至于你不能使它超出你的问题。又回到TMTOWTDI。

你创建一个句柄,并通过open函数把它和一个文件联结。open有两个参数:句柄和你想与它联结的一个文件名。Perl也给出一些预定义(和预打开的)句柄。STDIN是你程序的正常输入通道,而STDOUT是你程序的正常输出的通道。STDERR是一个附加的输出通道,以便当把输入转为输出时,程序能给出一些说明[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]。

打开一个已打开的句柄是隐式地关闭第一个文件,使它对Perl文件句柄不可取,并打开一个不同的文件。你必须小心这是你真正想做的。有时,偶然碰巧,比如,当你open($handle,$file)时,$handle正好包含空串(null)。确认设置$handle为某个单一个量,否则你将对空句柄打开一个新的文件。
一旦你已为输入打开一个句柄(或你使用STDIN),你就能使用"行读操作"<>,读一行。这个也以钻石操作闻名,因为它的形状。这个钻石操作包含你想读的句柄()[4]。使用STDID句柄读用户提供的答案,如下:

空钻石操作<>,将从命令行指定的所有文件读,如果没有指定,从STDIN读。(这是许多UNIX"过滤"程序的标准行为)

代码如下:

printSTDOUT"Enteranumber:";#请求输入一个数
$number=<STDIO>;#输入一个数
printSTDOUT"Thenumberis$number";#输出这个数

你明白我们给你的例子吗?在print语句中STDOUT做什么?这就是你使用一个输出句柄的方法之一。一个句柄可以作为print语句的第一个参数,如果存在,告诉往哪儿输出。在例子中,句柄是冗余的,因为输出已经是STDOUT。对于输入的缺省是STDIN,对于输出的缺省是STDOUT。(在班级例子的18行,我们为避免使你混淆,我们省略了。)
我们也有一件事使你不明白。如果你试上面的例子,你可以注意到你得到一个特别的空行。因为读时没有自动地从你的输入行中删除换行符(newline)(例如,你输入"9")。对于这些情况,当你想删除换行符时,Perl提供chop和chomp函数。chop将不加区别地删除(并返回)传给它的最后一个字符,而chomp只删除记录标识的末尾(一般地是""),并返回这样删除的字符数。

(0)

相关推荐

  • Perl文件句柄详解

    在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件.该函数取回一个顺序号,即Perl文件句柄(filehandle),该Perl文件句柄对于打开的文件是唯一的识别依据.要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将Perl文件句柄在内存中的地址和要拷贝的字节数传送给操作系统.当完成任务后,在通过调用系统函数来关闭该文件. 除了你模仿唯我论者哲学家编写一个人工智能程序,你的程序使用不和外界通讯的方法.在班级例子中的

  • Windows Server 2016 上配置 APACHE+SSL+PHP+perl的教程详解

    <strong><span style="color:#FF0000;">安装环境</span></strong> 谷歌云实例 Windows Server 2016 Apache Apache/2.4.25 (win64-VC14) PHP php-5.6.30 (VC11 x64 Thread Safe) PERL ActivePerl-5.24 (Win64) OpenSSL openssl-1.0.2j-win64 VC14 Mi

  • Perl 和 StrawberryPerl 与 ActivePerl 的区别详解

    Perl 是 Practical Extraction and Report Language 的缩写 "实用报表提取语言". ActiveStatePerl 和 Strawberry Perl 在 Windows 平台上Perl的编译器. Perl  于后两者的关系 是 C 语言和 linux 系统有自带的GCC 的关系. ActiveState Perl和 Strawberry Perl最大的区别是 Strawberry Perl 里面有多包含一些 CPAN 里的模块,所以Stra

  • perl之print,printf,sprintf使用案例详解

    目录 print printf sprintf 区别 参考文档 详细用法,可以查看perl用户手册. perldoc -f print perldoc -f printf perldoc -f sprintf 他们各自支持的命令格式,都有三四种.但是常用的,也就一两种. print 常用: print LIST print FILEHANDLE LIST 不常用(主要是因为隐含的细节,会导致阅读上的障碍吧): print FILEHANDLE print print $foo; print "H

  • Java 正则表达式入门详解(基础进阶)

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符").模式描述在搜索文本时要匹配的一个或多个字符串 先来两篇基础知识对于以前没了解过正则表达式的朋友可以先看下面两篇文章 1.正则表达式30分钟入门教程 30分钟内让你明白正则表达式是什么,并对它有一些基本的了解,让你可以在自己的程序或网页里使用它. 2.正则表达式基本语法详解 Java 正则表达式 正则表达式定义了字符串的模式. 正则表达式可以用来搜索.编辑或处理文本. 正则表达式并不仅限于

  • Linux正则表达式特性详解及BRE与ERE的异同点

    Linux正则表达式(Regular Expression)主要遵从POSIX BRE或者POSIX ERE标准.什么是POSIX呢,POSIX Portable Operating System Interface 可移植操作系统接口ERE是BRE的扩展版本,具体更强的处理能力,并增加了一些元字符(metacharactor). BRE主要的能力集有: 1) 普通字符(Literal text),如a,b,c等 2)非打印字符,包括TAB,回车,换行,回车换行(WINDOWS) 3)任意字符.

  • linux 守护进程详解及建立守护进程

    linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程. 守护进程的启动 要启动一个守护进程,可以采取一下几种方式: 在系统期间通过系统的初始化脚本启动守护进程.这些脚本通常在目录etc/rc.d下,通过它们所启动的守护进程具有超级用户的权限.系统的一些基本服务通常都是通过这种方式启动的. 很多网络服务程序都是由inetd守护程序启动的.它监听各种网络请求,如telnet.ftp等,在请求到达时启动相应的服务器程序(telnet server,ftp se

  • MySQL 序列 AUTO_INCREMENT详解及实例代码

    MySQL 序列 AUTO_INCREMENT详解及实例代码 MySQL序列是一组整数:1, 2, 3, ...,由于一张数据表只能有一个字段自增主键, 如果你想实现其他字段也实现自动增加,就可以使用MySQL序列来实现. 本章我们将介绍如何使用MySQL的序列. 使用AUTO_INCREMENT MySQL中最简单使用序列的方法就是使用 MySQL AUTO_INCREMENT 来定义列. 实例 以下实例中创建了数据表insect, insect中id无需指定值可实现自动增长. mysql>

  • 正则表达式的优化全面详解( 三江小渡)

    就像之前写的mysql全面优化详解一样,就是因为这样工具应用十分广泛,所以对这样的工具全面的进行优化策略总结是非常划算的,因为无论你是PHP.Perl.Python.C++.C#.Java等等语言的程序员,你都是有非常大可能用上Mysql.正则表达式这样的工具的. 先说一下你可能不知道的一点关于正则表达式的知识,这对我们将来的优化是有用的. 大家常见的grep(global regular expression print)算是现在的正则的起源吧(从神经学家提出正则概念到数学家建立模型到被IBM

  • Apache和Nginx的优缺点详解_动力节点Java学院整理

    Apache和Nginx比较 功能对比 Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP.Perl.Python等,同时还支持正向和反向代理.虚拟主机.URL重写.压缩传输.SSL加密传输等. 在功能实现上,Apache的所有模块都支持动.静态编译,而Nginx模块都是静态编译的, 对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好: 在处理连接方式上,Nginx支持epoll,而Ap

随机推荐