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

[经验分享] perl学习(5) 输入和输出

[复制链接]

尚未签到

发表于 2015-12-27 18:07:32 | 显示全部楼层 |阅读模式
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 循环)


技术上讲,<>从数组@ARGV 中得到调用参数。这个数组是Perl 中的一个特殊数组,其包含调用参数的列表,程序本身的名字存在Perl 的特殊变量$0  中,而非@RAGV。

<>操作查看@argv 来决定使用哪些文件。如果表为空,则使用标准输入流;否则,使用其找到的相应文件。

在启动程序后,使用<>之前,你还有机会修改@argv 的值。例如,下面程序可以处理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"x@items), @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 ;



运维网声明 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-157158-1-1.html 上篇帖子: 如何: 配置和测试 PERL 脚本与 IIS 4.0、 5.0、 5.1 和 6.0 下篇帖子: Perl中取出毫秒级定时信息
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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