perl学习(5) 输入和输出

发布时间:2016-12-9 23:32:30 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"perl学习(5) 输入和输出",主要涉及到perl学习(5) 输入和输出方面的内容,对于perl学习(5) 输入和输出感兴趣的同学可以参考一下。

1.1. 从标准输入设备输入 <STDIN> 行输入操作在到达文件的结尾时将返回undef,在while循环的条件中不能使用chomp:   while (defined($line = <STDIN>)) {        print “I saw $line”; }     在循环的内部,我们将看到每一行,一行接着一行,perl提供简写: while(<STDIN>){        print “I saw $_”; } while (defined($_ = <STDIN>)){        print “I saw $_”; } 两者是等同的 在进行深入讨论前,我们要澄清一些事:这种简写只在特定的情况下有效,默认的情况下不会将一行读入变量$_。仅当while循环的条件判断部分只包含行输入操作才有效。   对于foreach用法有些区别: foreach(<STDIN>){        print “I saw $_”; }   在while 循环中,Perl 读入一行,将它赋给变量,然后进入循环。再回到开头,读入下一行。在foreach 循环中,由于行输入操作在列表的context 中使用,因为foreach 需要一个列表作为其参数。 这一点影响很多,一次读一行和一次读一个文件差别很大。 1.2.命令行输入 参数为要被程序顺序处理的文件名。 尖括号操作(<>)是一种特殊的行输入操作,其输入可由用户选择: 可以使标准输入,也可以使命令行参数。   while (defined($line = <>)){        chomp($line);        print “It was &line that I saw!\n”; } 由于这是一种特殊的行输入操作,我们也可以使用前面的相似的简写方法: while(<>){        chomp;        print “It was $_ that I saw!\n”; } 输入结束时,<>将返回undef(同时退出while 循环)   技术上讲,<>[email protected] 中得到调用参数。这个数组是Perl 中的一个特殊数组,其包含调用参数的列表,程序本身的名字存在Perl 的特殊变量$0 中,[email protected] <>[email protected] 来决定使用哪些文件。如果表为空,则使用标准输入流;否则,使用其找到的相应文件。 在启动程序后,使用<>之前,[email protected] 的值。例如,下面程序可以处理3 个指定的文件,无论用户在命令行中输入了什么其它的文件: @argv = qw# larry mor curly #; #强制使用这三个文件 while(<>){        chomp;        print “It was $_ that I saw in some stooge-like file!\n”; }   1.3.标准输出 1.  print 通常,需要把程序的输出先缓存起来。将要输出的内容先缓存起来,等到有足够的内容再输入,而非立刻就输出。例如,假设要把输出的内容存入磁盘,如果有一个或两个字符就立刻输出到磁盘中,这将非常缓慢和低效。一般,先将要输出的内容存入一个缓存(buffer)中,当缓存满时,再将其输出。   2.  使用printf 格式化输出   #! /usr/bin/perl use strict ; use warnings ;   my $int = 10 ; my $double = 20.5 ; my $float = 30.5e10 ; # %g 自动选择 printf "%g\n",$int ; printf "%g\n",$double ; printf "%g\n",$float ;   #%d,%x,%o printf "%d\n",$int ; printf "%x\n",$int ; printf "%o\n",$int ; # %Nd 十进制整形输出,删除小数部分 printf "%f\n",$double ; printf "%d\n",$double ; #长度和对齐 printf "%10d\n",$int ; printf "%-10d\n",$int ; printf "%-10.3f\n",$double ;   #数组 my @items = qw{item1 item2 item3}; printf "The items are:\n".("%10s\n"[email protected]), @items;         1.4.文件输出 Perl 自身有六个文件句柄:STDIN,STDOUT,STDERR,DATA,ARGV,ARGVOUT 1.4.1.   文件句柄打开 open CONFIG, “dino”;         open CONFIG, “<dino”;              输入 open BEDROCK, “>fred”;    输出 open LOG,“>>logfile”;         追加   open 支持“3 参数”类型:        open CONFIG, “<”, “dino”;        open BEDROCK, “>”, $file_name;        open LOG, “>>”, &logfile_name(); 这种方法的优点是Perl 不会将模式(第二个参数)和文件的名字(第三个参数)混淆,这能增加安全性   打开时,可能出现因为文件不存在&权限等问题,句柄bad情况。 1.  如果从一个bad 文件句柄读入(文件句柄没有恰当的打开),会立刻到达文件结尾(end-of-file) 2.  如果写到一个bad 文件句柄,数据会被悄悄地丢掉 使用句柄时需要判断: my $success = open LOG, “>>logifle”; #将返回值保存在$success 中 if(!$success){        #打开失败时 ... }   1.4.2.   关闭句柄 close 句柄名 ; 当关闭文件句柄时,Perl 将告诉操作系统已经结束了对此数据流的操作,因此应当将输出的数据写到磁盘中. 如果程序重新打开它(也就是说,使用open 重新打开此文件句柄),或者退出程序,Perl 将自动关闭文件句柄.   1.4.3.   使用句柄 1.       输入句柄 if(! open PASSWD, “/etc/passwd”){        die “How did you get logged in?($!)”; } while(<PASSWD>){        chomp;     ... }   2.       输出句柄 写出(>)或追加的(>>)的文件句柄 可以和print 或printf 结合使用 printf (STDERR “%d percent complete.\n”, $done/$total * 100); printf STDERR (“%d percent complete.\n”, $done/$total * 100);     3.  默认句柄 默认情况下,如果不指定文件句柄给print(或者printf,这里的内容对两者均适用),则默认会使用STDOUT。但这个默认属性,可以通过select 操作进行更改。   1.4.4.   实例 #! /usr/bin/perl ####################### #读文件加行号写入新文件 ####################### use strict ; use warnings ;   my $format = __FILE__ . "-" . __LINE__ . ": %s"; if(!open LOG ,">>", "./log.20130911") {     die "open log.20130911 error:$!" ; } if(!open SRC ,"< ./find.plx") {     die "open ./find.plx error:$!"; } select LOG ; my $line=0 ; while(<SRC>) {     chomp ;     printf "$line" . ": %s" , "$_\n" ;     $line += 1 ; } close LOG ; close SRC ;    

上一篇:彩票小工具(可查询历史、增加新数据、产生随机数、历史对比等)
下一篇:perl学习(6) 哈希

相关文章

相关评论