先来一个例子吧
51Testing软件测试网 FsE5f(em|5e #!/usr/bin/perl
51Testing软件测试网5bJB+ks[H use warnings;
51Testing软件测试网+gp Y3h?Oh.r @array = qw(a b c d);
Y_
tYX!]2`.P(q0 foreach (@array) {
51Testing软件测试网't-H~b;A:Jb print $_," ";
51Testing软件测试网NT/gz'W
]1Ho)Gr }
_N[V/G:p#iieP5^01P]Q#hg,eP {X0d
Q0 例子的作用就是定义一个数组并把其中的元素打印出来,这里需要注意的是foreach循环部分,foreach循环的标准格式应该是:
51Testing软件测试网L$C:UF%QAZ foreach $element (@array){
,q2]|7Q5H$aZ9G,b0 ......
3s,T7SksZh;Q#lx0 }
51Testing软件测试网6I'w!anT"vEl51Testing软件测试网H6S)U yX[(BZ 其中数组@array将其中的元素依次赋值给$element,但是在上面那个程序中,我并没有这样做,在程序中,我就使用到了
perl中内置的一个特殊变量 $_ 。
.\v:aB ?uh0 在程序第五行中:foreach (@array) 实际上就是等于 foreach $_ (@array),在这里,$_是默认是输入/输出,因此,如果在程序中有类似的没有明确声明的变量位置的时候,就有可能能使用$_代替。
51Testing软件测试网tx5beJNUY!s2SL1|$~\0S0 再看另外一个内置变量
L8`q
`6G0un6T0 perl -e "sleep(5);print qq(The PID of process perl.exe is : $$)";
51Testing软件测试网 K9Smw5v'yA/~%B 这是一句命令行上使用的perl程序,作用就是打印出一段话:print qq(The PID of process perl.exe is : $$) ,在这里,存在着特殊变量$$ ;
51Testing软件测试网Aw.hchG/E
e5q $$是当前perl解析器的进程ID(即,PID),大家可以将在段程序写在命令行上,该程序会在perl解析器运行5秒后打印出perl解析器的进程ID,大家可以在程序运行期间通过查看进程列表来确定打印结果是否正确(^_^不会错的)。
51Testing软件测试网tQu
v,w5RK
\?p 接下来是一个用来返回错误信息(或是错误号)的特殊变量。51Testing软件测试网9\o6Bc
T!HrO7}%A
为了省事,不写程序了,还是来个命令行的吧
.pL7IL.N/\8{%d0 perl -e "opendir FH,'c: one' or die qq(can't open:$!);";
yW%SGZ
x7v-?P0 这句话就是要打开C盘下的一个none目录(而实际上我的C盘中并没有此目录,之所以这样写的目的就是为了引起一个程序中的错误信息),如果没有打开的话,会执行后面的die qq(can't open:$!)51Testing软件测试网!{7p1zLZ$X8U
在这里,$!就指明了错误信息的内容,命令行会返回错误信息:
"ZAe5k2N0 can't open:No such file or directory at -e line 1.51Testing软件测试网C8Wb#pY~
$!在open或是opendir中用的比较多(无论是打开文件还是管道或是其他)。51Testing软件测试网6}1u`4e
l!eV
51Testing软件测试网u$[aVY
BaFn#[E
y 来个例子,说一个有意思的特殊内置变量51Testing软件测试网/gl.J+lW/p
$text = "C:\test.txt";
2i^IOV7N0oY0 {
Zl:R%J$^)t0 open FH,$text or die "can't open:$!";51Testing软件测试网#\$}ga2BC6a f
my $line = ;
&x"u6\8`4{_8[zE.Cd0 close FH;51Testing软件测试网*UT"_:H+gd
print $line;51Testing软件测试网R+u0Hte9Yx0K U&f
}51Testing软件测试网*\|H5~k7s&JZ
print "#===========================# ";51Testing软件测试网Z.DG9{U
{
|4c{:_ R&f`6R!d?N0 undef $/;51Testing软件测试网9eA+r+F:G8Y
open FH,$text or die "can't open:$!";51Testing软件测试网~$C$EA}-hph
my $line = ;51Testing软件测试网_k;e#Jr?%c
`+q
close FH;51Testing软件测试网3RcU&r+m[3u/F
print $line;
z3`e'` B~0 }51Testing软件测试网i*j `zn
=================================51Testing软件测试网'a/}||@CP(?(G|
C盘下的test.txt的内容是:51Testing软件测试网I8o"d'C3xw
111111111111111111111111111
4~ ~yKAU'i0 222222222222222222222222222
R(R+Z.H k0 33333333333333333333333333351Testing软件测试网-sS)~d,bxw\
=================================
$upU7R)k0 好,程序的运行结果是:51Testing软件测试网$Q7Opj,@*a]uO)`
11111111111111111111111111151Testing软件测试网 Jnny'D
#===========================#51Testing软件测试网3NB
Ps
H'd&H
111111111111111111111111111
)FrC6x l\R%dD*oM0 222222222222222222222222222
S6}%[BO0 33333333333333333333333333351Testing软件测试网5~a*\+SYH}
51Testing软件测试网EZc0?Nt-Y
程序就不多废话了,作用就是读文件,关键部分在“$line = ”,尖括号操作符(即,<>)作用是读取一行文件内容(相信大多数教程或是书上都是这么写的),但是,这里所说的一行,实际上是有一个标准的,那就是当perl在遇到了换行符后,边认为是一行,而换行符默认情况下是由于$/这个特殊变量定义的,是缺省值。51Testing软件测试网W!AXd9P0VS@
也就是说,perl 在每次使用<>操作符读文件的时候,会先从$/中获得一个叫做“分隔符”的东西,并以该分隔符为标记来读取文件,如果按默认的$/来说,这个分割符就是一个换行符,所以,默认时,<>操作符才会每次读取一行文本。51Testing软件测试网RD_/c;BMxTdY
在给出的例子中,有这样一句 :undef $/ ,也就是将$/设置为未定义的值,这样一来呢,$/就不再起作用了,因此,大家可以看到,第二次进行同样的操作的时候, <>操作符就不再是只读一行而是将文件内容全部读出来了。
;]0P8Q%{-^;~
q051Testing软件测试网n"n4]
DGRK 接下来看一个会受到$/影响的内置变量,还是先说实例:
!m2Gkr`+G0 $text = "C:\test.txt";51Testing软件测试网9M/pNj7o,T
open FH,$text or die "can't open:$!";
L/k%Y7Q4Oi,_0 while () {
kMJ^;\U;v0 print "line $. is:$_";51Testing软件测试网e*@b?B}
}
8MvJ
T^^V0 close FH;
`P;WP)O2_+t1u;]n5Y0 先来看循环中的:print "line $. is:$_"
(T9g^%hi
c7g0 程序的作用是读文件,并且,将文件逐行赋值给$_(因为只用了<>操作符而没有指定内赋值变量,因此,默认就是赋值给了$_);51Testing软件测试网E)G6@R8sG+n(|
但是这里除了$_,还有一个变量“$.”
V
M6s1V0YPx0 我们来看一下结果:
[;k,M}d+B!C+Ks0 line 1 is:111111111111111111111111111
Y;AZ9|/gg.h0 line 2 is:222222222222222222222222222
CI+s9}is
D/p^/y0 line 3 is:333333333333333333333333333
;ec1B}6zr%P#]'g'x)@0 可见,变量$.的作用是一个类似计数器的东西,但是,为什么刚开始我说$.会受到$/变量的影响呢 ?
`O&]u-C051Testing软件测试网:|)A ul"?]_,~Sc
将上面的例子稍做修改,再看一下:
,H@Bv:|$Nq:m0 $text = "C:\test.txt";
#x
i/e h_0C6E#Zrg'd0 undef $/; # 注意,多加了这一行51Testing软件测试网1mWv&C!sj
open FH,$text or die "can't open:$!";
]{h*Ty_._R O0 while () {51Testing软件测试网#m3h%L7O-Z
print "line $. is:$_";51Testing软件测试网D}/u^x#nzhU
}51Testing软件测试网Y5{1X"h&sX]/KL
close FH;51Testing软件测试网 K$aWp;Pe G!m'q"yT
%a$h?7b*y'Eh0 第二行多加了一句undef $/; ,上面已经说过它的作用了,来看一下这段程序运行的结果:51Testing软件测试网~W
I*F-BRI5}&Y
line 1 is:11111111111111111111111111151Testing软件测试网N%hO-H_y
222222222222222222222222222
K|)vS(e\
l0 33333333333333333333333333351Testing软件测试网t#|9vOM)L
本来应该是三行的文本,不但被一次性打印出来,而且还指明了“line 1”(看来程序认为这个文本只有一行),为什么 ?
|'wC)d
Be R }(G!ujs0 这是因为$.变量并不是一个单纯的行计数器,确切地说,可以说$.是一个对$/计数器,我们再来看一段程序大概就会明白了:51Testing软件测试网LS y zC
jdS5P
$text = "C:\a.txt";51Testing软件测试网,sv)s/s+xl
$/ = ";"; # 注意这里,这里我并将$/设置为未定义,而是给其赋值为分号51Testing软件测试网e |y} n4t]^pa
open FH,$text or die "can't open:$!";
EN:Cw4\.q$`T0 while () {
*K.SR9](B:z(N!Y0 print "line $. is:$_ ";51Testing软件测试网0Mh{r#J#k8S\
}
_.Zgvk+pN0 close FH;51Testing软件测试网U9StOU.Y;Xd
;n:K:p@z$Co7s T I0 再看一下C盘下的a.txt的内容:
x?j2n$L7g$|&~0 ddd;bbb;ccc;fff;eee;51Testing软件测试网1pxq4F4RZL
就这么简单了。
6`A"Tq&Cd
k
z0 看一下运行结果:51Testing软件测试网
_Z9~9I|;KG.] x
line 1 is:ddd;51Testing软件测试网3u.u}Y.Tt
line 2 is:bbb;51Testing软件测试网I cR%v#q
line 3 is:ccc;
,D|&^5aFnG:rU-s0 line 4 is:fff;51Testing软件测试网!^FU.s;D`(F-C Y~
line 5 is:eee;
'uR2[:h.?)m\Fd0 看过这段程序应该就明白了吧。51Testing软件测试网 `1l#p z VDI'L.`
51Testing软件测试网:](P'ir1T4T+@
好,$.已经讲得差不多了,接下来再说一个它的特性,仍然是看程序说话:
fJ6C3` ](R U%P?0 $text = "C:\test.txt";51Testing软件测试网c/kq+{Sl3_D+\
open FH,$text or die "can't open:$!";51Testing软件测试网iY
{7b].t6a
while () {
U3y,c)S8@0 print "line $. is:$_ ";
?dJdPyZ0 }51Testing软件测试网,LP
r h U,a
print " ",$.;
-E:v/@tl2~
jh0 close FH;
$hvn3thI0 print " ",$.;51Testing软件测试网o2eS!_Q
这个程序要注意的是最后三行中的两个print " ",$.;(一个是在关闭文件前,另外一个则是在关闭文件后)。51Testing软件测试网8u\3N2FQ7n9if
看一下执行结果:
m/pi(fv^$D0 line 1 is:111111111111111111111111111
e1fh"Tf6V2{3|0 line 2 is:22222222222222222222222222251Testing软件测试网,@G
C;R
`\1a].R
line 3 is:333333333333333333333333333
X2kyq'A7|0 3
z$b6Fd@,o/?7F0 0
\
J |&` QBaA,]0 结果的前三行刚才就已经知道了,这不是我们关心的,我们应该关心的是最后两行结果(即两个print " ",$.;的结果);
rNBm4m!W2C]"c'T0 $.变量是具有记忆性的(从原理上来将,它是一个包变量),因此,在关闭文件前打印会发现,它的值是还没有变化的(这时的值和最后一次读完文件的值均为3);51Testing软件测试网g2y2?u2XM`
而在关闭文件后,该变量又被重新初始化为0了。
BBEx$zAO0 这个特性大家注意一下就可以了,因为其中的原理涉及到了perl的作用域和包的一些知识,不是很容易说清楚,所以就不说了,如果对包和作用域有了解的读者对这部分即使我不讲他们也应该能理解的。51Testing软件测试网;~X+n#r5`5FJKfvh
TL.u
te0 再说最后一个吧
rM2A/ABW0 说一个用来简单判断操作系统类型的,看个例子:
`IOhb0 C:>perl -e "print $^O;";51Testing软件测试网 po#d7X1\I/OE?
MSWin32
#W |@~2u1O0 注意,这里这个特殊变量$^O 最后一个字符是字母O,且大写。51Testing软件测试网6J/RI
t.g
如果是在linux下的话,结果就不是MSWin32了,而是Linux ;
-Lu wL)?#j;S1]'O0 这是一个判断环境的变量,简单实用。51Testing软件测试网
D_-sv j
51Testing软件测试网EUkXJsk
perl的内置特殊变量还有很多的,例如常用的还有@_、@ARGV、$ARGV、%INC、%ENV等等,有很多,不可能一一列举了,这里给出一个比较有总结性的列表,是chinaunix上perl社区的一个网友总结的,还算比较全:51Testing软件测试网#emr,{T[3j%[O!r]
$- 当前页可打印的行数,属于Perl格式系统的一部分51Testing软件测试网&u.FR Pm1t4m-o
$! 根据上下文内容返回错误号或者错误串51Testing软件测试网
T@r-m
AHwk
$” 列表分隔符51Testing软件测试网Ph~(f-q}4z2Y`4@
$# 打印数字时默认的数字输出格式
TR(?*l e0{[A0 $$ Perl解释器的进程ID
a"b0mcm0 $% 当前输出通道的当前页号
t{6Pa`s,T8K0 $& 与上个格式匹配的字符串
%@BI@&J0 $( 当前进程的组ID51Testing软件测试网w$~4@*DtHF?c
$) 当前进程的有效组ID
_&j%E@ [;p:F0UI0 $* 设置1表示处理多行格式.现在多以/s和/m修饰符取代之.
Qt"d,]:C1qJ0 $, 当前输出字段分隔符51Testing软件测试网8}Z|6R1D3R
$. 上次阅读的文件的当前输入行号
/ys$[I!_gr
W*z"NE,Z0 $/ 当前输入记录分隔符,默认情况是新行51Testing软件测试网C
L0hp1`|J-A
$: 字符设置,此后的字符串将被分开,以填充连续的字段.
O2B O-B0@2`mb0 $; 在仿真多维数组时使用的分隔符.
b%I0~;RHcrF9n0 $? 返回上一个外部命令的状态51Testing软件测试网3l'Wj+B4q1A u!M(CS
$@ Perl解释器从eval语句返回的错误消息
OZ
@2xyA!RIj0 $[ 数组中第一个元素的索引号51Testing软件测试网5AlK-^(G*qRE
$ 当前输出记录的分隔符
5xk _B7n3z^__4kIK0 $] Perl解释器的子版本号51Testing软件测试网Ob4cC[V4k*N
$^ 当前通道最上面的页面输出格式名字
2k&v}?i0 $^A 打印前用于保存格式化数据的变量51Testing软件测试网3oh:Vk6{ B]TO
$^D 调试标志的值
V1{8|h3u;?;[&xG0 $^E 在非UNIX环境中的操作系统扩展错误信息
te!x&I`Xx0 $^F 最大的文件捆述符数值51Testing软件测试网x%aH8H!I#s \}(p(`
$^H 由编译器激活的语法检查状态
%{5Q-H,z
M`#U0 $^I 内置控制编辑器的值
5Qg(K2o)T"GEd {h4S/_F0 $^L 发送到输出通道的走纸换页符51Testing软件测试网C5`u%?,V4E
K
f*q/_'^
$^M 备用内存池的大小51Testing软件测试网(AJk^q$m'|]
$^O 操作系统名51Testing软件测试网7}
T:b)J|/g$E
$^P 指定当前调试值的内部变量51Testing软件测试网+h5x:|#ghO N }-D4`~U
$^R 正则表达式块的上次求值结果
yU"{%M h@+N!i0 $^S 当前解释器状态
`$?r7P ]
@Du6\D0 $^T 从新世纪开始算起,脚步本以秒计算的开始运行的时间
7Azen`0Ej0 $^W 警告开关的当前值
)m0Rc0Z;L(ME1~0 $^X Perl二进制可执行代码的名字
] l+I4[t~i2_0 $_ 默认的输入/输出和格式匹配空间51Testing软件测试网4A1W9\&ss[6sM3UC
$| 控制对当前选择的输出文件句柄的缓冲
*PZ,qGs)B|o0 $~ 当前报告格式的名字51Testing软件测试网Tz
WxSYV1M"J
$` 在上个格式匹配信息前的字符串
[#Oecp`D&}
Mg0 $’ 在上个格式匹配信息后的字符串
_^q7`P1E-[v:a0 $+ 与上个正则表达式搜索格式匹配的最后一个括号
%g_}xo A~F0 $< 当前执行解释器的用户的真实ID
'g;m%BJ Q#E!URz0 $ 含有与上个匹配正则表达式对应括号结果
zr1Wjin5Z
g0 $= 当前页面可打印行的数目
4KPk;Q H-Y F6J_r0 $> 当前进程的有效用户ID51Testing软件测试网9J\'c9k ALJ"i
$0 包含正在执行的脚本的文件名51Testing软件测试网@%e;i
~9kd4E
$ARGV 从默认的文件句柄中读取时的当前文件名
,t$k| m'e0 %ENV 环境变量列表
-[g%@G]4X`0 %INC 通过do或require包含的文件列表51Testing软件测试网:v&Vvn.o&`9t
%SIG 信号列表及其处理方式51Testing软件测试网F)t)YE e-N
o2fT
@_ 传给子程序的参数列表51Testing软件测试网@rME`"Q1yO],Z
@ARGV 传给脚本的命令行参数列表51Testing软件测试网^&ab,cWz6k.ax
@INC 在导入模块时需要搜索的目录列表51Testing软件测试网4b4U)n(Bw${|6Z/r#G v
$-[0]和$+[0] 代表当前匹配的正则表达式在被匹配的字符串中的起始和终止的位置 。
,S f d6L
C@)\_$H?0
R z5j:A1vN-alk0