设为首页 收藏本站
查看: 824|回复: 0

[经验分享] perl文件句柄【转】

[复制链接]

尚未签到

发表于 2015-12-26 15:05:16 | 显示全部楼层 |阅读模式
  本文和大家重点讨论一下Perl文件句柄的概念,在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即Perl文件句柄(filehandle),该Perl文件句柄对于打开的文件是唯一的识别依据。
  
  Perl文件句柄
  
  在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件。该函数取回一个顺序号,即Perl文件句柄(filehandle),该Perl文件句柄对于打开的文件是唯一的识别依据。要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将Perl文件句柄在内存中的地址和要拷贝的字节数传送给操作系统。当完成任务后,在通过调用系统函数来关闭该文件。
  
  --------------------------关于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),你就能使用"行读操作"<>,读一行。这个也以钻石操作闻名,因为它的形状。这个钻石操作包含你想读的句柄(<SESAME>)[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只删除记录标识的末尾(一般地是""),并返回这样删除的字符数。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156651-1-1.html 上篇帖子: perl如何访问Oracle (ZT) 下篇帖子: perl命令行参数
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

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