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<10;$i++){
print $i;
}
将显示出从0到9的所有整数。
foreach $variable(@array){
循环体;
}
这个类似于shell语言的foreach,它把@array的内容一条一条赋给$variable并执行里面的语句。
跳出循环
有两个语句用来实现特殊控制:
last if 用在循环里,相当于break;
next if 相当于continue.
⑤文字处理运算
除了正常的字符串处理语句外,perl还支持一种文字处理运算方式,基本格式是$string=~(文字处理模式)。这个文字处理模式是perl的主要优点之一,由于perl的文字处理运算模式太强大了,这里只能介绍几个非常基本的形式。
首先解释一下pattern的概念.pattern一般是用两个/字符夹在一起的一些字符串, 用来代表一些具有某些特点的字符串, 实际上,这个patternj基本上就是grep/egrep里面的正则表达式,只是功能更丰富一点。常用的有:
任意字符串: 匹配该字符串
[0-9] 匹配所有数字字符
[a-z] 所有小写字母
[^0-9] 所有的非数字
[^a-z] 所有的非小写字母
[A-Z] 所有的大写字母
^ 字符串开头的字符
$ 字符串结尾的字符
\d 跟[0-9]一样
\D 非数字字符
\w 就相当于[a-zA-Z0-9]
\W 相当于[^a-zA-Z0-9]
\s 一个空白的字符
\S 非空白的字符
\d+ 一个相当于数字的字符串
\w+ 一个完全由数字或字符构成的字符串
\b 一个不由英文字母或者数字为边界的字符串
\B 一个由字母或数字为边界的字符串
a|b|c 符合a,b,c之一的字符串
/pattern/i i代表忽略大小写
[] 找寻符合[]内的字符,例如[abde]可以匹配a,b,d,e的任何一种
? {m} 正好是m个指定的字母
{m,n} 多于m少于n个指定的字符
\ 如果要引用一些在pattern中具有特殊意义的字符,使用\前缀
在perl的文本运算模式中,最常用的是=~或者!~运算符号和s,tr两个函数。=~表示匹配,它用右边的模式来匹配左边的字符串,如果成功就得到一个true,!~正好相反,代表不匹配,例如
$string="chmod711cgi";
if($string=~"/chmod/"){
print "Found chmod!\n";}
$string=~"/chmod/"这样的表达式询问是否/chmod/可以匹配$string,因为$string中包含chmod,所以if语句会成功地执行。
tr是串转换函数,例如:
$string=~tr/a-z/A-Z/;
将字符串中的小写字母转换成大写.
s是串取代函数,例如:
$string=~s/a/A/;
把第一个a换成A,还可以加后缀g表示全程替换,例如:
$string=~s/1/A/g;
变换后,$string变成chmod7AAcgi.
注意tr和s的区别,tr的多替换一般是一对一的,或者说是字符的替换,而s是字符串的替换,长度可以改变,例如如果$string的值是chmod711cgi,那么
$string=~s/1/ONE/g;
将变成chmod7ONEONEcgi.而
$string=~tr/1/ONE/;
将把$string变成chmod7oocgi。
还有一个很实用的功能是变数替换,例如:
$string="test24";
$string=~s/(\d+)/<$1>/;
这时,s首先搜索满足\d+(数字)的串,得到24,然后送入$1,接着再套上<>,结果是 "test<24>".
⑥内置变量
除了用户定义的变量之外,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/>/>/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的特色。
阅读(2849) | 评论(0) | 转发(0) |