加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl学习(5) 输入和输出

发布时间:2020-12-16 00:08:44 所属栏目:大数据 来源:网络整理
导读:1.1. 从标准输入设备输入 STDIN 行输入操作在到达文件的结尾时将返回 undef , 在while 循环的条件中不能使用chomp : ? while (defined($line = STDIN)) { ?????? print “I saw $line”; } ? ? 在循环的内部,我们将看到每一行,一行接着一行,perl提供简

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 "%gn",$int ;

printf "%gn",$double ;

printf "%gn",$float ;

?

#%d,%x,%o

printf "%dn",$int ;

printf "%xn",$int ;

printf "%on",$int ;

# %Nd 十进制整形输出,删除小数部分

printf "%fn",$double ;

printf "%dn",$double ;

#长度和对齐

printf "%10dn",$int ;

printf "%-10dn",$int ;

printf "%-10.3fn",$double ;

?

#数组

my @items = qw{item1 item2 item3};

printf "The items are:n".("%10sn"x@items),@items;

?

?

?

?

1.4.文件输出

Perl 自身有六个文件句柄:STDINSTDOUTSTDERRDATAARGVARGVOUT

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 ;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读