Perl语言入门学习笔记-4

上一篇 / 下一篇  2007-08-30 14:42:33 / 个人分类:编程吧

n7hIUVV0输入与输出

|}c0vv?5I:E)us0

yneuy"A)nv0+读取标准输入——再谈<STDIN>51Testing软件测试网n$AVrS_y3M;WwS
纠正:<STDIN>应该是大写,已经在以前的笔记中做了相应改动。
7B I,t$E6og[0+从钻石操作符<>输入程序的调用参数(命令行参数)
2r/uw#X | qk/C'Mo1B0利用这个功能可以写出类似Unix工具的程序。51Testing软件测试网1b7^K)N:Px"mF!|
<>是<STDIN>的特例,可以从用户指定的输入来源来取得所有输入。也就是说,在列表上下文中<>会返回所有输入行所组成的列表。不要让多个<>同时出现哦!
3p+O6H^{N0若<>无法打开某个输入文件并将之读入,会显示以下诊断信息,并自动跳到下一个文件51Testing软件测试网a:AJ2?'{ Z+MF
can't open wilma: No such file or directory
'w6xo0l]WKEkG0$./perl_program arg1 arg2 - argn...  #参数-代表标准输入流,即键盘,其他参数可以是指定文件51Testing软件测试网*[J4lyDx0E h;h/`
while(defined($line=<>)) { 51Testing软件测试网Z FJ8X/q
#依次从arg1、arg2、标准输入、...、argn中读入各行,只有在遇到所有输入的结尾时,
nm6lN i/S WW6K(`0#才返回undef,跳出循环51Testing软件测试网 Y.@]-pJH7`8A
  chomp($line);51Testing软件测试网A9X0a!v!m*?:\f
  print "It was $line that I saw!\n";51Testing软件测试网!wB:xf0\Z/sq
}
`Z,j%sXVx/^W0或简写为
{gtb)^2~w-] d0while(<>) {  #记住条件式里只有<>哦
5V`Sx|2J0  chomp;  #不加参数时,直接作用于$_。节约按键,从小事做起!51Testing软件测试网8Y$ffDh8@#ZY5Q s
  print "It was $_ that I saw!\n";51Testing软件测试网 Ae-wO^j^$E;H
}51Testing软件测试网F:y*w)~7_N)tG
其实<>是利用@ARGV工作的。51Testing软件测试网 om g:}B6p
++调用参数的数组@ARGV
K T ?rF@&?l'a0调用参数被存入@ARGV,<>查找@ARGV,如果是空列表,改用标准输入流,否则使用@ARGV里的文件列表。
R;I,j)JK$B8OA1j K0程序运行之后,在没有使用<>之前,可以对@ARGV动点手脚。51Testing软件测试网+n4Z$nUZFH7l
例子,不管你在命令行里输入了什么,一律处理3个特定文件51Testing软件测试网|l%l9Re4B^1h7\-F
@ARGV=qw# larry moe curly #;
HmW,T sA8O0while(<>) {51Testing软件测试网 I\.dU%U_t
  chomp;
e,E9[*TU(H0  print "It was $_ that I saw in some stooge-like file!\n";51Testing软件测试网gDd)MSuW
}
$c3]YM[1I%Fw0+输出至标准输出51Testing软件测试网$D4`%ui|
++print操作符
*c!u1r2] p*J]5v0print读取一个列表中的所有值,并把每个项目依次送到标准输出,在项目之前、之间、之后不加入额外的字符。51Testing软件测试网y/u_u*J [Eo4G`
@array=qw/ fred barney betty /;51Testing软件测试网{(@8N$lwzE.y
print @array;  #输出列表中的项目,各个项目之间没有空格,即fredbarneybetty51Testing软件测试网_ Cf:]Ll_
print "@array";  #先进行数组替换,再输出一个字符串,每个元素之间加上空格,即fred barney betty
4W-g/w3`j/N0@array=<STDIN>; #@array里的每个元素以换行符结尾
VF zW)M#L+E$x0print @array;  #正常输出各行
&@5a!i]P`o&If0print "@array";  #完了,除了第一行外,每一行都向后缩进一个空格
MCDVnHk0print <>;  #'cat'的源代码51Testing软件测试网Mq^Z}:_ f
print sort <>;  #'sort'的源代码
0~D_;o8Scv T^0print reverse <>;  #'tac'的源代码
L0^+IjVTj)k,M0print的返回值:输出执行成功,为“真”,反之为“假”。
e] l9FB-IR0没有括号时,print是列表操作符,会把其后列表中的所有项目都输出。
._'OpJ~kDL7m(z.\-^0有括号时,print是函数调用,只输出括号里的项目。51Testing软件测试网?b\i{ h B
++printf操作符——格式化输出51Testing软件测试网T1Az2Eq
printf的参数包括格式字符串和要输出的数据列表,格式字符串和要转换的项目应该一样多。格式字符串可以是任意表达式。51Testing软件测试网;y(Uh2i |%Vjg#ZT
%ms: 字符串形式,指定字段宽度为m(不足m加空格补齐),m>0时字符串向右对齐,m<0时字符串向左对齐51Testing软件测试网RN"q(l,Gs7X#\p!k
%md: 十进制形式,指定字段宽度为m,不会四舍五入
A-i0dQs4Y"A-I%W[0%m.nf:浮点数形式,指定字段宽度为m,小数点后保留n位,会四舍五入
gvMl PQ9?0%%: 输出%,不会用到列表中的元素
_a _R_&B+A^s0%g:适当的数值形式,根据需要自动选择浮点数、整数、指数形式等
)~Q[+c'M%}0printf "%g %g %g\n",5/2,51/17,51**17;  #2.5,3,1.0683e+2951Testing软件测试网RiT6Wf'S Q
用printf格式化输出数组中的元素
P ~,q3K Q+[2|3c0数组不能作为printf的参数,因为数组可以有任意数目的元素,而printf的格式字符串只能用到固定数目的元素。技巧:将格式字符串的表达式存储于变量中。
&j _$Ul;cFtM0例子:51Testing软件测试网 L*P4GW},gz WZ
my @items=qw( wilma dino pebble );51Testing软件测试网w'C|;n`
my $format="The items are: \n" . ("%10s\n" x @items);
0Vr!@;B%d4Bq0printf $format, @items;51Testing软件测试网 yQ fT1fnF
+文件句柄(filehandle)
]9jQ$|-ssY7v0文件句柄代表了Perl进程与外界之间的输入/输出联系。51Testing软件测试网c)G ] xoM0l
文件句柄的命名与其他标识符相同,一般用大写字母表示。51Testing软件测试网2}jq:o"bp&j1v8D:m
Perl有6个保留的文件句柄:STDIN, STDOUT, STDERR, DATA, ARGV, ARGVOUT51Testing软件测试网f"_:~2]M0E7O$AR
STDIN:标准输入流,是进程与输入来源(通常是键盘)之间的联系。
X `fBF`W:oo2U4]0STDOUT:标准输出流,是进程与输出来源(通常是屏幕)之间的联系。51Testing软件测试网q{6v#fFjB.b|
STDERR:标准错误流,通常不经过缓冲。
]BA E!}(~oA0@如果STDOUT和STDERR都流向同一个地方,错误信息可能会在正常信息之前出现。51Testing软件测试网Lea2BU%g1~4gO']
++打开文件句柄
)T:I Ho M0G ~q0STDIN、STDOUT、STDERR都是由Perl进程的父进程(可能是shell)自动打开的文件或设备。
Q/bfaQp0若使用其他文件句柄,用open操作符要求OS打开文件句柄。
CGq,zcN9w4LX,x0open CONFIG,"<dino";
4V4^ OFX.kL/i0open LOG,">>logfile";
'a;T6J(J;{'a[/^x0#Perl5.6之后,也可以这样写:51Testing软件测试网%lr)QE$]d
open CONFIG,"<","dino";51Testing软件测试网S&[M'l5e&Q-rn/h
open LOG,">>","logfile";51Testing软件测试网Pn:iW*i-b0_x;TE
+++不良文件句柄
G)^4xK2Ru(Xm0即没有完全打开的文件句柄,OS可能因为权限或错误文件名等因素拒绝为Perl进程打开文件句柄。51Testing软件测试网d"Y%^"d&z3s y&\t
尝试从不良文件句柄读取数据,会立即读到文件结尾。文件结尾在标量上下文中是undef,在列表上下文中是空列表。51Testing软件测试网%hd"@9SO
若向不良文件句柄中写入数据,这些数据将会被丢弃。
N^4~TISQ01. 开启-w或use warnings51Testing软件测试网R%S/ZU/mEM+C3?*j
2. 用open的返回值来判断,“真”表示成功,“假”表示失败51Testing软件测试网 ]A'Y}jmX
my $success=open LOG,">>logfile";
q*c+C"B(YK s8{(j6FCw0unless($success) {51Testing软件测试网P$n C_,y9gd"J
  ...
}4u;XR\0}
5jD O l j%{]0++关闭文件句柄51Testing软件测试网R Kb U,dY c
close LOG;
9\w7W+vY3X,Q0幕后发生的事情:51Testing软件测试网/{*Dl$_i#r-sZ*m abr K
如果管道中还有输入数据,正在写入的程序可能会得到管道即将关闭的信号;51Testing软件测试网h+B.J;lu"f0r}PX
如果还有要送往文件或管道的输出数据,缓冲区会清空;
/Q+l6mn;G(Iv(O0如果文件句柄被锁定,则会被解除锁定。
X ^.V f4E*[5PBy0成功重新打开某个文件句柄时,会自动关闭原来的文件句柄。当然你不应该把STDIN重新打开成输出,或另外两个重新打开成输入。51Testing软件测试网,mYz.eL
open STDERR, ">>/home/barney/.error_log"51Testing软件测试网4W J Eb x0AW1p0A
  or die "Can't open error log for append: $!"; 51Testing软件测试网H,ap U dQE%p
#如果STDERR没有被成功地重新打开,那么它还是原来那个它51Testing软件测试网!~M|:Rn(H8p
程序结束时,也会自动关闭文件句柄。51Testing软件测试网#BW5T7{q Yv9ID&i
++使用文件句柄
x+fy v_.\-X0以读取方式打开文件句柄,可以从它读取数据。
7{4NW'qAV%m0例子:
8Q6W6N8K$J&X&i0`7R d-D0open PASSWD,"/etc/passwd";
"iE+[)_0H9P(z%J0while(<PASSWD>) { 51Testing软件测试网h,y&UVM-h
  chomp;
p\ [*h&s1mP0  ...51Testing软件测试网v m)` AF/U6I p*n
}51Testing软件测试网K3qB6x9m4t@
以写入或添加方式打开的文件句柄可以在print/printf函数中使用,放在关键字之后,参数列表之间。
)L&n2p+oD0注意,文件句柄和输出列表之间没有逗号分隔,
8r&\*BZ;h Ds3^0print LOG "something to print out...\n";  #不提供文件句柄的话,输出到STDOUT51Testing软件测试网8Ua0\~(Q%pm3?;m_7L
print (LOG "something to print out...\n");51Testing软件测试网SS4V+P@d5D'}Mb
print LOG ("something to print out...\n");
r rH+~S-B0print LOG "%d percent complete.\n", $percentage;51Testing软件测试网u0R+@P n^"`d K q
++改变默认的输出文件句柄51Testing软件测试网!Y J Pk @+RGo:D
select LOG;  #将输出送到LOG,其实Perl有两个select内置函数,去看看perlfunc在线文档吧51Testing软件测试网/_&IS`I
$|=1;  #指定每次输出操作时数据立刻输出到当前默认的文件句柄LOG,不进行缓冲处理51Testing软件测试网jY/zS P DGC^I
select STDOUT;  #再恢复默认值
1Le&K5Re;@S g)?;s051Testing软件测试网2KF9?9B%r@z T$vDZ/e
+用die处理严重错误51Testing软件测试网 sh&S7J4v;`
当Perl发生严重错误(fatal error)时,程序应该终止运行并显示错误信息。51Testing软件测试网h}B5lz4~Pw
die函数可以定义“严重错误”的信息并输出到STDERR,并使程序在非零的结束状态(exit status)下立刻终止。51Testing软件测试网-A b#cfM K-]
if(! open LOG,">>logfile") {51Testing软件测试网Ms g3Y"t+I4Q.[S
  die "Cannot create logfile: $!";  #$!代表发生系统服务请求错误时产生的信息51Testing软件测试网zD+W$T [FbLA
}
pB1U#}uV` ]0die会自动将Perl程序名称和行号附加在错误信息后。如果在die函数的信息尾端加上换行符,就不会显示程序名和行号了。51Testing软件测试网8Y:Nh*n2kN2yK
Cannot create logfile: permission denied at your_program line 1234.51Testing软件测试网.HbFh3FME.k*l
if(@ARGV<2) {51Testing软件测试网;F4v/i!b0|[
  die "Not enough arguments \n";
C']e!_+jO/qL_s0}51Testing软件测试网%Z@ c8bK6S:J.Y.]
+用warn发出警告信息51Testing软件测试网 R,D ?%]R8@h6U,ggw
warn函数可以产生类似于Perl内置警告信息的信息,并送到STDERR,不会终止程序的运行,也可以加入程序名和行号。
r$Aci;\.p#L!r5z0来自die、warn的信息默认情况下自动输出到STDERR,当然可以让它们输出到文件。
4lKH3niaj\0open STDERR, ">>/home/sophia/.error_log"
F4rO3a/^!@%U7a0  or die "Cannot open error log for append: $!";
]2`asg/zbPH0
-JBr\;yC0习题2、3
R ]%lG6sa T0#!/usr/bin/perl -w

&w/q i,J J#|Z0

h t%w*rZJZ"i0print "Please input strings in separate lines. Press Ctrl+D to end your input.\n";51Testing软件测试网g-}8SA.}
chomp(@line=<STDIN>);
0G;@*Tvi aE+V0print "Please specify the width of strings: ";
3S |3hc-jN"uKJ8ZK,|0chomp($width=<STDIN>);
Q4c,SdA^$a0print "1234567890"x6,"\n";
:MFt_ V&E0$format="%${width}s\n";
k3T L[-I x_ot0foreach (@line) {
Z!|A}ln4GO_0  printf $format,$_;
!dxqiA0}
SL4n_+P0P0

fX3L/u*A$pxl0

TAG: 编程吧

 

评分:0

我来说两句

日历

« 2024-04-12  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 22344
  • 日志数: 38
  • 文件数: 1
  • 书签数: 3
  • 建立时间: 2007-08-14
  • 更新时间: 2008-05-01

RSS订阅

Open Toolbar