11.3 Perl
Perl是从awk发展起来的,它由Larry Wall在1986年发明。它是一种功能强大的编程
语言,而且可以在许多平台上使用。实际上,你完全可以将Perl作为一种标准编程语言( 不是脚本语言)来使用,笔者非常喜欢它,并且建议所有不想学习C
语言的UNIX管理员应该掌握Perl的基本编程技术。目前,常用的版本是perl 5,几乎所有的Linux发行版本都会包含它,缺省时,linux的
perl 5安装在/usr/bin下,命令是/usr/bin/perl.
11.3.1 基本语法
perl的语法介于C和basic之间,一个perl程序由若干行组成,使用的时候由perl解释程序解释执行。每个完整的行都应该用分号结尾。
Perl的基本语法是这样的:
① 变量和运算符
在perl中,所有变量都不需要提前声明。一旦对某个变量赋值,就自动产生了这个变量。perl的变量有普通变量,数组和关联数组三种。普通变量就是数值和字符串,要声明一个普通变量,在变量名字前面加上$,例如
$string1="aaa";
$test=5;
$u=1.33;
同样,访问变量内容也需要使用$符号。
数组用@字符标志,如
@name1=("tom","marry","john");
$b=$name[0]; $b现在等于"tom"
$b=@name[0];跟上一句是一样的
$name[0,2]=["help","so"];现在@name等于[“help","marry","so"]
@name[0,2]==@name[2,0];交换0,2元素
数组的大小不是固定的,你可以动态地添加数组元素,例如
$name[3]="app";增加一个元素
直接访问数组名字将得到数组中元素的个数,例如:
$count=@name;将name的元素个数存放到$count变量中。
关联数组是一种特殊的数组,每个元素都由一对元素构成。或者说,关联数组是一种下标不是整数的数组,要声明一个关联数组,使用%符号,例如:
%arr=(1,"one",2,"two",3,"three",4,"four");
这时可以用前面的值(key)来索引后面的值:
$one=$arr{1};这时$one等于"one"
注意关联数组的访问方式,是使用$关联数组名字[索引号]。
你可以把关联数组看成数据库的一种实现。与一般的数组一样,其大小也可以动态调节:
$arr{5}="five";增加一对数据。
可以将关联数组简单地变成普通数组,例如
@X=%arr;现在@X的内容是X[0]="1",X[1]="one",……………
perl的运算符与C语言以及我们介绍的gawk很相似,包括普通的+-*/%以及来自C语言的逻辑运算符&&(和),||(或),等等,下面是一个列表:
+ - * / 四则运算,注意perl的除法是浮点除法
$a % $b a对b取余数,例如3%2的结果是1
$1 .. $2 区段运算符,这个算符取出$1和$2中间的所有值,例如1..9返回一个表
1,2,………9。通常用这个命令初始化一个数组,例如:@dec=1..9;@oth=(1..26,'A'..'Z')等等。
= 赋值算符
> < >= <= == !=
这几个算符是数字之间的比较算符。
perl中没有专门的boolean型变量,而是象C语言一样认为所有不为零的量为真值,而0或者空字符串为假。与C语言类似,Perl支持以下的逻辑运算符:
&& 与 || 或 ! 非
同样,perl也支持位运算:
& 与 || 或 ^ 异或
还有就是与C语言相似的运算符使用方式,如
$i+=$j; 等效于$i=$i+$j,同样还可以使用$i-=5;$i&=12。这样的算式
$i++; 等效于C语言的++,将i加一,++$i,$i--,--$i都是可以使用的。
除了上面的标准算式之外,perl支持字符串运算,首先是字符串之间的比较命令:
$str1 gt $str2 $str1大于$str2
$str1 lt $str2 $str1小于$str2
$str1 ge $str2 $str1不小于$str2
$str1 le $str2 $str1不大于$str2
$str1 eq $str2 $str1等于$str2
$str1 ne $str2 $str1不等于$str2
$str1 cmp $str2 根据$str1是大于,等于还是小于$str2,返回1,0或者-1。
上面的字符串比较都是使用字典顺序,即ASCII码的顺序。
另一个非常有用的运算符是点号运算符,这个运算符用于把两个字符串连接成一个,例如:
$str1="string1";
$str2="string2";
$string3=$str1.$str2;这时$string3等于"string1string2"
②基本语句和函数:
#
这个符号代表注释的开始。
print
显示字符串,写文件,如
print "hello\n";或者print "the var is $i","\n";注意变量名会自动地被替换成变量值,除非你用一个\符号明确地告诉perl:
print "\$i is a str";
print FILE "hello\n";向FILE对应的文件写,FILE是一个文件句柄;
split 分割字符串,格式split(/模式/,$string);
例如$string="i:am:perl";
@list=split(/:/,$string);
#这时@list=("i","am","perl")
($a,$b,$c)=split(/:/,$string);
delete $ARRAY(key)
这个函数用于在关联数组中删除一对记录。例如,%arr=(1,”one”,2,”two”,3,”three”); delete $arr(2);执行上述操作之后,%arr的内容变为(1,”one”,2,”two ”)。
keys(%ARRAY)
取出关联数组%ARRAY中所有的索引key。这个操作将返回一个数组。例如,对于上面的%arr,执行@test=key(%arr)的结果是@test成为(1,2)。
values(%ARRAY)
取出关联数组%ARRAY中所有的value,同样返回一个数组,例如对于%arr,@test=values(%arr)的结果是@test变成(”one”,”two”)。
reverse(@array)
把@array反转排列。例如@test=(1,2,5,3,10),@other=reverse(@test)的结果是@other变成(10,3,5,2,1)。
sort(@array)
排序,注意这个排序是按照字符串的排序,例如@other=sort(@other)的结果是(1,10,2,3,5)。
chop($string)
删除字符串的最后一个字符,通常用于去掉输入字符串中的回车符。
lenth($string)
取字符串长度
substr($string,offset,length)
取字符串子串,即从$string的offset偏移量处截取length长度的字符串作为子串返回
index($string,$substring)
在$string中查找$substring,成功的话,返回$substring在$string中的偏移量,如果不存在就返回-1。
push(@array,$string)
在@array末尾加入$string
pop(@array)
删除@array的末尾元素并返回这个元素
shift(@array)
删除@array的开头元素并且返回这个元素
join($string,@array)
在@array中间加入$string并返回结果
grep(/pattern/,@array)
在@array中用正则方式查找符合条件的元素
hex($string)
将16进制转化为十进制
rand
产生随机数,注意应该先执行srand初始化随机数种子。
localtime
返回时间数组
die LIST
显示字符串并且退出程序
pack("格式”,LIST)
把一个LIST转换成指定的二进制格式,例如:$string=pack('C",65)这时$string等于ASCII的65,即"A"
反引号
用反引号将某个字符串括起来的效果是使perl执行系统命令,这里使用的反引号是大键盘最左边键,如`ls`执行ls命令。
③使用文件
在perl中使用文本文件非常简单,只要使用open和close打开和关闭文件:
open 打开文件
close 关闭文件
open
函数的格式是open(Filehandle,$filename),这个操作将会打开$filename文件,并且让Filehandle句柄指向打开
的文件。如果失败,将返回false。缺省下,文件是以只读的方式打开的。如果要打开名字为$filename文件用于输出,使用open
(Filehandle,">$filename")。想要在某个文件的后面追加内容,使用open(Filehandle,">>$
filename")。当然,open(Filehandle,"<$filename")也是可以使用的,不过这就等于open
(Filehandle,"$filename")。
read 读文件,格式是read (Filehandle,$string,length),这函数从Filehandle指向的文件中读取length个字符,存放到$string变量中。如果你要得到标准输入,使用STDIN的句柄。
close (Filehandle)将关闭由open语句打开的文件。
除了用read语句的标准方法之外,还有一个经常用的方法:
$filecontent=;从句柄FILE指向的文件中读取一行,内容存入$filecontent变量。如果你要从控制台读取一个字符串,使用$input=;就可以了。
下面是一个例子:
$filename="test";
open (FILE,"$filename")||die "can not open file!;
while($line={
print "$line";
}
close(FILE);
这个程序实际就是cat命令的perl语言实现,open命令打开当前目录下面的test文件,并且把句柄返回到FILE变量,注意这一行的用法,
Perl的||(或)运算是短路求值的,如果open成功,那么返回一个非0的数,因此这算式无论如何都会为真,所以会跳过||后面的东西;否则,如果
open失败,perl就要对后面的东西执行一下,于是退出这个程序。
打开成功之后,perl会得到这个文件的句柄,下面的句子就是反复读取文件的每一行并且显示出来,当文件读到末尾的时候,$line=将产生一个空字符串,于是while循环结束。
与shell脚本语言类似,perl还有一些文件测试运算符
-t $file
如果$file这个文件可读,返回1,$file是文件名。
-w $file
如果$file可写,返回1
-x $file
如果$file可以执行,返回1
-e $file
如果$file存在,返回1
-o $file
如果用户是$file的拥有者,返回1
-s $file
返回$file文件的大小
-f $file
是否为正常文件
-T $file
是否文本
-B $file
是否二进制文件
-M $file
文件从更新到现在的日期数
④流程控制
perl支持与C语言很相似的流程控制语句:
if和if..else:
if语句的语法是
if(...){
clause;
}
与C语言不同,即使只有一行程序,if后面的花括号也不能省略,这一点也适用于后面说的其他复合语句。
与C语言类似,也可以用else和elseif子句:
if(...){
clause1;}
else {
clause2;
}
或者
if (…){
...
}
elseif(…){
....
}
else{
...
}
另外,perl还支持unless语句:
unless(exp1){
clause1;
}
如果exp1不成立,就执行clause1子句。这个unless语句里面也可以使用else子句。实际上,这就是一种否定形式的if……else语句。
阅读(3291) | 评论(0) | 转发(0) |