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. MyGui 3.2.0(OpenGL平台)的编译

    MyGui是一个用来创建用户图形界面的库,用于游戏和3D应用程序.这个库的主要目标是达到:快速.灵活.易用. 1.下载准备: 源代码:http://svn.code.sf.net/p/my-gui/c ...

  2. HTML5API___manifest

    离线缓存 manifest 在html标签里面增加个属性 mainfest 就可以告诉浏览器缓存文件在哪里. <html manifest='show.manifest' xmlns=" ...

  3. 汉字转拼音的vc++程序源代码

    #include "StdAfx.h" #include "MyChiToLetter.h" // Download by http://www.codefan ...

  4. N个任务掌握java系列之统计一篇文章中单词出现的次数

    问题:统计一篇文章中单词出现的次数 思路: (1)将文章(一个字符串存储)按空格进行拆分(split)后,存储到一个字符串(单词)数组中. (2)定义一个Map,key是字符串类型,保存单词:valu ...

  5. XML读写文件辅助类

    /// <summary> /// 历史下载记录xml文件操作 /// </summary> public class XMLHelper { private string x ...

  6. mysql查询数据库中包含某字段(列名)的所有表

    SELECT TABLE_NAME '表名',TABLE_SCHEMA '数据库名',ORDINAL_POSITION '顺序',COLUMN_NAME '字段',DATA_TYPE '类型' ,CH ...

  7. javascriptDOM编程艺术_学习笔记_知识点 DOM

    第三章   getElementById    返回一个与那个有着给定id属性值的元素节点对应的对象. document.getElementById(id) 下面一个例子: document.get ...

  8. IOS 学习笔记(5) 控件 文本视图(UITextView)的使用方法

    相对于UILabell所支持的较短文本内容,UITextView对于长文本的支持更好.UITextView能够以滚动的方式全部浏览到长文本,并且就像UILabel那样,从ISO6,他也提供了对NSAt ...

  9. android screenOrientation

    Activity: android:screenOrientation 横(landscape)竖(portrait)屏显示. 如果想让它一直是横屏显示的话,xml:android:screenOri ...

  10. 我的Fedora环境

    Fedora现在也更新到了第20个版本,只是在15+以后的版本,大多数操作,都是大同小异的,也不必特意去关注版本号,只有对应到具体的软件,可能会因为库的版本,有或多或少的区别. 之前每次都喜欢按照一些 ...