- 论坛徽章:
- 0
|
Unix/Linux 平台任务的自动化(二)
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')等等。
= 赋值算符
> = $filename")。想要在某个文件的后面追加内容,使用
open(Filehandle,">>$filename")。当然,open(Filehandle,";从句柄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语句。
while循环语句:
while的语法有两种,分别是将表达式放在循环首部和尾部,第一种形式是:
while(exp){
clause;
}
第二种形式是
do {
clause;
}
while(exp);
都是循环执行clause直到exp不成立,不过一个在循环头部判断exp表达式是否为真,另一个是在循环尾部。
until循环
语法是until(exp){
clause;
}
反复执行clause直到exp成立。
for循环
for(初始化;继续条件;增量){
循环体;
}
这个for循环和C的一样,首先执行初始化语句,然后开始循环执行循环体,每次循环都调用一次增量表达式,直到循环继续条件不再成立。例如
for ($1=0;$i/;
这时,s首先搜索满足\d+(数字)的串,得到24,然后送入$1,接着再套上,结果是 "test".
⑥内置变量
除了用户定义的变量之外,perl还定义了一些内置变量,它们在perl中有特殊的意义,用户不能修改它们的含义(有些可以赋值),下面是常用的内置变量:
@ARGV
这
是个数组,它代表的是传递给perl程序的命令行开关,如@ARGV[0]是第一个参数,@ARGV[1]是第二个等等。如果你的perl程序名字叫
test,而你用test me other去调用它,那么@ARGV[0]是”me”,@ARGV[1]是other,以此类推。
$_和$1,$2,………
这几个参数用于文本处理模式中的临时变量。举个例子来说,串匹配模式中:
$string="chmod711cgi"
$string=~/(\w+)\s+(\d+)/;
看
上去这第二行代码什么也不做,因为它仅仅是个匹配语句。不过,实际上,由于perl会把临时变量放进$n变量,所以它会修改$_和$1,………变量。在这
个匹配模式中,首先的\w+匹配一组字符,成功,得到chmod字符串,于是perl将它保存到$1;然后,\s+匹配一组空白符号,失败;最后,\d+
匹配一组数字,成功,得到711,perl将它保存到$2。
如果在匹配模式中没有指明对那个串变量使用匹配模式,就使用$_进行匹配。
⑦自定义函数
Perl程序中允许定义自己的子程序。例如,下面的语句定义了一个子过程:
sub my_proc {
print “this is my subrouting\n”;
}
sub是子过程的说明,my_proc是过程名字,要调用这个过程,只要使用&符号,例如:
if($want==1){
&my_proc;
}
11.3.2 perl的使用
上
面介绍了perl的基本语法。要使用perl,你当然可以在交互模式下使用,但是,一般情况下,我们用perl是代替shell脚本完成自动化任务的。为
此,我们需要把perl写成程序来运行。写perl程序可以用任何文本编辑工具创建,一般总是设置其扩展名为.pl,虽然实际上扩展名是不需要的。
要运行一个perl程序,有两种方法,一种是调用perl解释器读入perl源程序,例如,我们已经写了一个perl程序,命名为test.pl,那么,可以用下面的命令执行它:
$ /usr/bin/perl test.pl
不过,在一般情况下,我们更喜欢在命令行下面直接敲入程序的名字执行它,为此,可以在perl程序的头部加入这样的行:
#!/usr/bin/perl
注
意#!符号,它告诉shell应该用什么程序来解释当前脚本,这里的定义是/usr/bin/perl,这是缺省的的perl安装位置。如果你的perl
可执行程序放在别的目录下,自己修改这一行。这样,当shell读到这个文件的时候,就会自动启动perl来解释这个程序。
perl最常用的功能是用来写cgi程序,不过,我们不想涉及cgi程序的细节。相反,我们介绍如何用perl进行日常管理,用perl程序代替书写晦涩的shell脚本。
让
我们从一个我自己的例子开始,我经常要把一些txt文本直接转化成html文本,以便做进一步的编辑和主页发布,其实这个操作非常简单,就是将回车和大于
号,小于号都换成对应的HTML标记,这可以用word或者netscape来完成,但是如果涉及的文件数目比较多或者文件比较大,用这些软件就很困难
了,所以我写了一个十分简单的perl脚本:
#!/usr/bin/perl
if((@ARGV[0] eq "")||(@ARGV[1] eq "")) {
print "convert inputfile outputfile\n";
exit;}
open (FILE1,"@ARGV[0]")||die"can not open source file!\n";
open (FILE2,">@ARGV[1]")||die "can not open taget file!\n";
while($line=){
$line=~s//>/g;
$line=~s/\^M//g;
$line=~s/\n/
/g;
print FILE2 $line;
}
close (FILE1);
close (FILE2);
这个程序简单得几乎象是DOS的批命令,首先检查参数是否定义,然后从输入文件中读取行,把回车和两个尖括号换成对应的html标记,写入对应文件,任务就完成了。要使用它,比如把test.txt转换成test.html,可以直接执行:
./convert.pl test.txt test.html
perl也可以完成更复杂的操作,最常见的功能扩展是进行网络编程,如直接使用电子邮件,电子新闻服务等等。不过我们这里不能进一步介绍它的强大功能。对perl感兴趣的朋友,可以进一步查阅有关书籍学习编程技术。
11.4 其他工具
还有很多自动化脚本工具,例如python等等。另外,对于一个职业的系统管理人员,熟悉C语言的编程是很有好处的。
就
我个人而言,我感到,如果你不想学习shell,那么了解expect和perl就足以对付一般的系统管理工作。另外,还有一些威力强大的可编程工具,一
个是我们刚才提到的python,这是一种面向对象的脚本平台,如果你的大部分任务使用shell和expect,那么这个东西可能很适合你使用。
另
外一个非常有争议的产品是emacs。这个编辑工具是GNU计划的头号产物,随着发展,它已经从原来一个文本编辑程序发展成为一个使用lisp宏控制,几
乎可以做文本界面下的一切事情的集成环境。反对它的理由主要是它的运行速度在低配置的机器上几乎无法忍受,而且配置起来也十分困难。不论如何,使用
emacs有时显得比较有专业特色,至少是很有GNU的特色。
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/70515/showart_1161118.html |
|