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 ;

perl学习(5) 输入和输出的更多相关文章

  1. perl学习笔记——输入与输出

    读取标准输入 用<STDIN>进行标准输入:chomp($line=<STDIN>); 如果读到文件尾,行输入操作符就会返回undef.便可利用这一性质跳出循环. while( ...

  2. 从0开始的Python学习015输入与输出

    简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...

  3. C++学习42 输入和输出的概念

    我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...

  4. Erlang学习记录:输入和输出

    输入和输出 输入和输出功能都被定义在io模块 输出功能非常常用,由于erlang项目没有可断点调试的IDE(或者说根本不需要),所以所有的调试操作都是由io输出 来调试的 io:get_line/1. ...

  5. Python学习--02输入和输出

    命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...

  6. python语言学习5——输入和输出

    输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 注意点: 字符串用的是单引号 碰到逗号输出时就会输出一个空格 输入 python提供了一个input(),可以让用户输入一个字 ...

  7. Python学习笔记-输入与输出

    一.Python提供了raw_input()和input()两个函数实现数据输入. 1.raw_input() 接收字符串类型的输入数据. str1=raw_input("请输入字符串:&q ...

  8. Python学习--02输入和输出、运算符

    命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...

  9. 吴裕雄--天生自然 PYTHON3开发学习:输入和输出

    str = input("请输入:"); print ("你输入的内容是: ", str) # 打开一个文件 f = open("/tmp/foo.t ...

随机推荐

  1. 关于iOS8上本地通知接收不到的问题

    在iOS8系统开发使用本地通知时,会出现如下的相关提示语: 1 Attempting to schedule a local notification2 with an alert but haven ...

  2. BootStrap 智能表单系列 二 BootStrap支持的类型简介

    代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/master/demo/form1-basic.html): <! ...

  3. NGUI Button 3中点击事件的触发

    NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,点击按钮触发的方法名必须为OnClick,当 ...

  4. SQL Server2012新特性概述

    公司最近要升级数据库,SQL Server 2008R2-->2012.再开始升级之前先找了点资料分析一下2012的新特性和功能,提前预热一下. 2012中主要关注一下三个领域: 性能:改进的核 ...

  5. Vector(容器)

    vector(容器)就像数组一样,但比数组强大很多,下面介绍一下vector常用的几种方法: 一.对于vector自身的处理,包括赋初始值,复制等等: vector<int> v1 ; v ...

  6. BZOJ 2724: [Violet 6]蒲公英( 分块 )

    虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...

  7. Android 开发笔记 “Sqlite Cursor 使用”

    使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...

  8. codeforces 613A. Peter and Snow Blower

    题目链接 给一个多边形, 一个多边形外的定点, 求这个点距离多边形的最短距离和最长距离. 最长距离肯定是和某个顶点的连线, 而最短距离是和点的连线或是和某条边的连线. 对于一条边上的两个点a, b, ...

  9. jar 打包后的文件执行时出现错误:RunJar jarFile [mainClass] args...

    修改别人的jar包中的配置文件,然后再打包后执行出错:RunJar jarFile [mainClass] args... 经过分析,是因为打包时需要设置mainClass,可以通过如下方法: jar ...

  10. samba服务器上文件名大小写

    samba服务器上文件名大小写 如果给HP_UX配置samba之后,通过windows访问有时候会发现文件名大小写不对时,请注意下述配置信息是否正确.在/etc/opt/samba/smb.conf中 ...