Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1631745
  • 博文数量: 185
  • 博客积分: 10363
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-11 22:29
文章分类
文章存档

2013年(12)

2012年(5)

2011年(2)

2010年(12)

2009年(9)

2008年(15)

2007年(48)

2006年(82)

分类: LINUX

2007-09-05 10:00:20

 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/   
  $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的特色。
阅读(2854) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~