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 循环)
技术上讲,<>从数组@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) 输入和输出的更多相关文章
- perl学习笔记——输入与输出
读取标准输入 用<STDIN>进行标准输入:chomp($line=<STDIN>); 如果读到文件尾,行输入操作符就会返回undef.便可利用这一性质跳出循环. while( ...
- 从0开始的Python学习015输入与输出
简介 在之前的编程中,我们的信息打印,数据的展示都是在控制台(命令行)直接输出的,信息都是一次性的没有办法复用和保存以便下次查看,今天我们将学习Python的输入输出,解决以上问题. 复习 得到输入用 ...
- C++学习42 输入和输出的概念
我们经常用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上.从操作系统的角度看,每一个与主机相连的输入输出设备都被看作一个文件.除了以终端为对象进行输入和输出外,还经常 ...
- Erlang学习记录:输入和输出
输入和输出 输入和输出功能都被定义在io模块 输出功能非常常用,由于erlang项目没有可断点调试的IDE(或者说根本不需要),所以所有的调试操作都是由io输出 来调试的 io:get_line/1. ...
- Python学习--02输入和输出
命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...
- python语言学习5——输入和输出
输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字. 注意点: 字符串用的是单引号 碰到逗号输出时就会输出一个空格 输入 python提供了一个input(),可以让用户输入一个字 ...
- Python学习笔记-输入与输出
一.Python提供了raw_input()和input()两个函数实现数据输入. 1.raw_input() 接收字符串类型的输入数据. str1=raw_input("请输入字符串:&q ...
- Python学习--02输入和输出、运算符
命令行输入 x = input("Please input x:") y = raw_input("Please input x:") 使用input和raw_ ...
- 吴裕雄--天生自然 PYTHON3开发学习:输入和输出
str = input("请输入:"); print ("你输入的内容是: ", str) # 打开一个文件 f = open("/tmp/foo.t ...
随机推荐
- 关于iOS8上本地通知接收不到的问题
在iOS8系统开发使用本地通知时,会出现如下的相关提示语: 1 Attempting to schedule a local notification2 with an alert but haven ...
- BootStrap 智能表单系列 二 BootStrap支持的类型简介
代码如下(链接地址:https://github.com/xiexingen/Bootstrap-SmartForm/blob/master/demo/form1-basic.html): <! ...
- NGUI Button 3中点击事件的触发
NGUI事件的种类很多,比如点击.双击.拖动.滑动等等,他们处理事件的原理几乎万全一样,本文只用按钮来举例. 1.直接监听事件 把下面脚本直接绑定在按钮上,点击按钮触发的方法名必须为OnClick,当 ...
- SQL Server2012新特性概述
公司最近要升级数据库,SQL Server 2008R2-->2012.再开始升级之前先找了点资料分析一下2012的新特性和功能,提前预热一下. 2012中主要关注一下三个领域: 性能:改进的核 ...
- Vector(容器)
vector(容器)就像数组一样,但比数组强大很多,下面介绍一下vector常用的几种方法: 一.对于vector自身的处理,包括赋初始值,复制等等: vector<int> v1 ; v ...
- BZOJ 2724: [Violet 6]蒲公英( 分块 )
虽然AC了但是时间惨不忍睹...不科学....怎么会那么慢呢... 无修改的区间众数..分块, 预处理出Mode[i][j]表示第i块到第j块的众数, sum[i][j]表示前i块j出现次数(前缀和, ...
- Android 开发笔记 “Sqlite Cursor 使用”
使用过 SQLite 数据库的童鞋对 Cursor 应该不陌生,如果你是搞.net 开发你大可以把Cursor理解成 Ado.net 中的数据集合相当于dataReader.今天特地将它单独拿出来谈, ...
- codeforces 613A. Peter and Snow Blower
题目链接 给一个多边形, 一个多边形外的定点, 求这个点距离多边形的最短距离和最长距离. 最长距离肯定是和某个顶点的连线, 而最短距离是和点的连线或是和某条边的连线. 对于一条边上的两个点a, b, ...
- jar 打包后的文件执行时出现错误:RunJar jarFile [mainClass] args...
修改别人的jar包中的配置文件,然后再打包后执行出错:RunJar jarFile [mainClass] args... 经过分析,是因为打包时需要设置mainClass,可以通过如下方法: jar ...
- samba服务器上文件名大小写
samba服务器上文件名大小写 如果给HP_UX配置samba之后,通过windows访问有时候会发现文件名大小写不对时,请注意下述配置信息是否正确.在/etc/opt/samba/smb.conf中 ...