Perl语言入门学习笔记-4
上一篇 / 下一篇 2007-08-30 14:42:33 / 个人分类:编程吧
n7hIUVV0输入与输出
|}c0v v?5I:E)us0yneuy"A)nv0+读取标准输入——再谈<STDIN>51Testing软件测试网n$A VrS_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/SWW6K(`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@#ZY5Qs
print "It was $_ that I saw!\n";51Testing软件测试网Ae-wO^j^$E;H
}51Testing软件测试网F:y*w)~7_N)t G
其实<>是利用@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软件测试网M q^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{
hB
++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位,会四舍五入
gvMlPQ9?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软件测试网 yQf T1fnF
+文件句柄(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:标准错误流,通常不经过缓冲。
]BAE!}(~oA0@如果STDOUT和STDERR都流向同一个地方,错误信息可能会在正常信息之前出现。51Testing软件测试网Lea2BU%g1~4gO']
++打开文件句柄
)T:IHoM0G~q0STDIN、STDOUT、STDERR都是由Perl进程的父进程(可能是shell)自动打开的文件或设备。