LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
123
返回列表 发新帖
楼主: mikkoyue

管理脚本语言 [转]

[复制链接]
 楼主| 发表于 2005-3-22 11:12:03 | 显示全部楼层
Perl

Perl的基本特点

  “别期望在一刻钟内就能领略Perl的所有神奇之处,这种情况很像吃香蕉,用不着吃完整只香蕉后才知其味,每咬一口都是享受,并促使你再咬下一口,再下一口。”上面这段话是Perl项目发起人劳利·华尔(LarryWall)对学习Perl语言的一段经典评论,希望大家都能找到这种感觉。
  Perl的设计目标是帮助UNIX用户完成一些常见的任务,这些任务对于Shell来说过于沉重或对移植性要求过于严格。Perl语言中包含了C、C ++、shell,script、sed、awk这几个语言的语法,它最初的目的就是用来取代UNIX中sed/awk与脚本语言的组合,用来汇整信息,产生报表。因此Perl语言要远远比前面讲的BASH复杂和功能强大。Perl的设计原则或者说Perl的设计哲学是以实用为第一优先,也就是力图使 Perl语言容易使用、有效率、而且完整。
  Perl是按GNUPublicLicense和ArticticLicense两种许可证形式分发的,其实质是开源软件、自由软件的,原先运行于 UNIX和类UNIX系统,现在已可以方便地在OS/2,Windows9x,Windows/NT等系统下运行。Perl是一种解释运行的语言,和 BASH程序一样,一般Perl程序的第一行需注明自己是一个Perl程序而不是Shell程序,所以一般将下面一行语句:

  #!/usr/bin/perl  作为文件的第一行。

  Perl由于引入了模块的设计思想,随着版本的改进,功能越来越强。现在Perl的功能已经超乎原先设计时的想象,几乎任何事都可以做到,也变成每一部工作站必备的标准工具了。Perl最为著名的一点就是他对字符串的处理,由于Internet对文字信息处理的巨大需求,使得Perl的应用如日中天,而且Perl语言也的确是一个非常优秀的文字信息处理语言。
   一个有用的Perl程序可以很短。例如希望更换大量文件中的一些相同内容,可以使用下面的一条命令:
  perl-e's/gopher/WorldWideWeb/gi'-p-i.bak*.html

下面是一个基本的perl程序:
  1. #!/usr/local/bin/perl
  2. #
  3. #Programtodotheobvious
  4. print'Helloworld.';#只是简单地显示出Helloworld.字符串。
复制代码


变量

Perl中有三种变量:标量,数组(列表)和相关数组。

  Perl中最基本的变量类型是标量。标量既可以是数字,也可以是字符串,而且两者是可以互换的。具体是数字还是字符串,可以有上下文决定。标量变量的语法为$variable_name。例如:
$priority=9;
把9赋予标量变量$priority,你也可以将字符串赋予该变量:
$priority='high';

  注意在Perl中,变量名的大小写是敏感的,所以$a和$A是不同的变量。
  以下的数值或字符串都可以赋给标量:
12312.45E-100xff(hex)0377(octal)
'Whatyou$seeis(almost)what\nyouget''Don\'tWalk'
"Howareyou?""Substitutevaluesof$xand\nin\"quotes."
`date``uptime-u``du-sk$filespec|sort-n`
$x$list_of_things[5]$lookup{'key'}
  从上面可以看出,Perl中有三种类型的引用。双引号("")括起来的字符串中的任何标量和特殊意义的字符都将被Perl解释。如果不想让Perl解释字符串中的任何标量和特殊意义的字符,应该将字符串用单括号括起来。这时,Perl不解释其中的任何字符,除了\\和\'。最后,可以用(`)将命令括起来,这样,其中的命令可以正常运行,并能得到命令的返回值。请看下面的例子:

1 #!/usr/bin/perl
2 $folks="100";
3 print"\$folks=$folks\n";
4 print'\$folks=$folks\n';
5 print"\n\nBEEP!\a\LSOMEBLANK\ELINESHERE\n\n";
6 $date=`date+%D`;
7 print"Todayis[$date]\n";
8 chop$date;
9 print"Dateafterchoppingoffcarriagereturn:[".$date."]\n";

  注意实际程序中不应该包括行号。其输出结果如下:

$folks=100
$folks=$folks\n
BEEP!someblankLINESHERE
Todayis[03/29/96]
Dateafterchoppingoffcarriagereturn:[03/29/96]

第3行显示$folks的值。$之前必须使用换码符\,以便Perl显示字符串$folks而不是$folks的值100。
第4行使用的是单引号,结果Perl不解释其中的任何内容,只是原封不动地将字符串显示出来。
第6行使用的是(`),则date+%D命令的执行结果存储在标量$date中。

上例中使用了一些有特殊意义的字符,下面列出这些字符的含义:
\n  换行。
\r  回车。
\t  制表符。
\a  蜂鸣声。
\b  Backspace。
\L\E 将\L和\E之间的字符转换成小写。
\l  将其后的字符转换成小写。
\U\E 将\U和\E之间的字符转换成大写。
\u  将其后的字符转换成大写。
\cC  插入控制字符C。
\x## 十六进制数##。
\0ooo 八进制数ooo。
\\  反斜杠。
\   按原样输出下一个字符,例如:\$输出$。

Perl中的数字是以浮点形式存储的。下面列出有关的数字运算符:
$a=1+2;  #1加2,结果存储在$a中。
$a=3-4;  #3减4,结果存储在$a中。
$a=5*6;  #5乘6,结果存储在$a中。
$a=7/8;  #7除以8,结果存储在$a中。
$a=9**10; #9的10次方,结果存储在$a中。
$a=5%2;  #取5除2的余数,结果存储在$a中。
++$a;   #$a加1,然后赋予$a。
$a++;   #先将$a返回,然后$a加1。
--$a;   #$a减1,然后赋予$a。
$a--;   #先将$a返回,然后$a减1。
Perl支持的逻辑运算符:
$r=$x||$y$r=$x或$y。
$r=$x&&$y$r=$x与$y。
$r=!$x$r=非$x。
对于字符标量,Perl支持下面的运算符:
$a=$b.$c; #将$b和$c连接,然后赋予$a。
$a=$bx$c; #$b重复$c次,然后赋予$a。
下面是Perl中的赋值方法:
$a=$b;   #将$b赋予$a。
$a+=$b;   #$b加$a,然后赋予$a。
$$a-=$b;  #$a减$b,然后赋予$a。
$a.=$b;   #把$b连接到$a的后面,然后赋予$a。
你也可以使用下面的比较运算符:
$x==$y  如果$x和$y相等,则返回真。
$x!=$y  如果$x和$y不相等,则返回真。
$x<$y   如果$x比$y小,则返回真。
$x<=$y  如果$x小于等于$y,则返回真。
$x>$y   如果$x比$y大,则返回真。
$x>=$y  如果$x大于等于$y,则返回真。
$xeq$y  如果字符串$x和字符串$y相同,则返回真。

数组
  数组也叫做列表,是由一系列的标量组成的。数组变量以@开头。请看以下的赋值语句:
@food=("apples","pears","eels");
@music=("whistle","flute");

  数组的下标从0开始,你可以使用方括号引用数组的下标:
$food[2]
返回eels。注意@已经变成了$,因为eels是一个标量。

  在Perl中,数组有多种赋值方法,例如:
@moremusic=("organ",@music,"harp");
@moremusic=("organ","whistle","flute","harp");

  还有一种方法可以将新的元素增加到数组中:
push(@food,"eggs");

  把eggs增加到数组@food的末端。要往数组中增加多个元素,可以使用下面的语句:
push(@food,"eggs","lard");
push(@food,("eggs","lard"));
push(@food,@morefood);
push返回数组的新长度。

  pop用来将数组的最后一个元素删除,并返回该元素。例如:
@food=("apples","pears","eels");
$grub=pop(@food);#此时$grub="eels"
请看下面的例子:
1 #!/usr/bin/perl
2 #
3 #AnexampletoshowhowarraysworkinPerl
4 #
5 @amounts=(10,24,39);
6 @parts=('computer','rat',"kbd");
7
8 $a=1;$b=2;$c='3';
9 @count=($a,$b,$c);
10
11 @empty=();
12
13 @spare=@parts;
14
15 print'@amounts=';
16 print"@amounts\n";
17
18 print'@parts=';
19 print"@parts\n";
20
21 print'@count=';
22 print"@count\n";
23
24 print'@empty=';
25 print"@empty\n";
26
27 print'@spare=';
28 print"@spare\n";
29
30
31 #
32 #Accessingindividualitemsinanarray
33 #
34 print'$amounts[0]=';
35 print"$amounts[0]\n";
36 print'$amounts[1]=';
37 print"$amounts[1]\n";
38 print'$amounts[2]=';
39 print"$amounts[2]\n";
40 print'$amounts[3]=';
41 print"$amounts[3]\n";
42
43 print"Itemsin\@amounts=$#amounts\n";
44 $size=@amounts;print"SizeofAmount=$size\n";
45 print"Item0in\@amounts=$amounts[$[]\n";
以下是显示结果:
@amounts=102439
@parts=computerratkbd
@count=123
@empty=
@spare=computerratkbd
$amounts[0]=10
$amounts[1]=24
$amounts[2]=39
$amounts[3]=
Itemsin@amounts=2
SizeofAmount=3
Item
  第5行,三个整数值赋给了数组@amounts。第6行,三个字符串赋给了数组@parts。第8行,字符串和数字分别赋给了三个变量,然后将三个变量赋给了数组@count。11行创建了一个空数组。13行将数组@spare赋给了数组@parts。15到28行输出了显示的前5行。34到41行分别存取数组@amounts的每个元素。注意$amount[3]不存在,所以显示一个空项。43行中使用$#array方式显示一个数组的最后一个下标,所以数组@amounts的大小是($#amounts+1)。44行中将一个数组赋给了一个标量,则将数组的大小赋给了标量。45行使用了一个Perl中的特殊变量$[,用来表示一个数组的起始位置(缺省为0)。

相关数组
  一般的数组允许我们通过数字下标存取其中的元素。例如数组@food的第一个元素是$food[0],第二个元素是$food[1],以此类推。但 Perl允许创建相关数组,这样我们可以通过字符串存取数组。其实,一个相关数组中每个下标索引对应两个条目,第一个条目叫做关键字,第二个条目叫做数值。这样,你就可以通过关键字来读取数值。相关数组名以百分号(%)开头,通过花括号({})引用条目。例如:

%ages=("MichaelCaine",39,
"DirtyDen",34,
"Angie",27,
"Willy","21indogyears",
"TheQueenMother",108);
这样我们可以通过下面的方法读取数组的值:
$ages{"MichaelCaine"};#Returns39
$ages{"DirtyDen"};#Returns34
$ages{"Angie"};#Returns27
$ages{"Willy"};#Returns"21indogyears"
$ages{"TheQueenMother"};#Returns108

文件操作

文件句柄和文件操作
  我们可以通过下面的程序了解一下文件句柄的基本用法。此程序的执行结果和UNIX系统
的cat命令一样:
  1. #!/usr/local/bin/perl
  2. #
  3. #Programtoopenthepasswordfile,readitin,
  4. #printit,andcloseitagain.
  5. $file='/etc/passwd';#Namethefile
  6. open(INFO,$file);#Openthefile
  7. @lines=<INFO>;#Readitintoanarray
  8. close(INFO);#Closethefile
  9. print@lines;#Printthearray
复制代码


  open函数打开一个文件以供读取,其中第一个参数是文件句柄(filehandle)。文件句柄用来供Perl在以后指向该文件。第二个参数指向该文件的文件名。close函数关闭该文件。
open函数还可以用来打开文件以供写入和追加,只须分别在文件名之前加上>和>>:
open(INFO,$file);#Openforinput
open(INFO,">$file");#Openforoutput
open(INFO,">>$file");#Openforappending
open(INFO,"<$file");#Alsoopenforinput

  另外,如果你希望输出内容到一个已经打开供写入的文件中,你可以使用带有额外参数的print语句。例如:
printINFO"Thislinegoestothefile.\n";
  最后,可以使用如下的语句打开标准输入(通常为键盘)和标准输出(通常为显示器):
open(INFO,'-');#Openstandardinput
open(INFO,'>-');#Openstandardoutput
  一个Perl程序在它一启动时就已经有了三个文件句柄:STDIN(标准输入设备),STDOUT(标准输出设备)和STDERR(标准错误信息输出设备)。如果想要从一个已经打开的文件句柄中读取信息,可以使用<>运算符。

  使用read和write函数可以读写一个二进制的文件。其用法如下:
read(HANDLE,$buffer,$length[,$offset]);
  此命令可以把文件句柄是HANDLE的文件从文件开始位移$offset处,共$length字节,读到$buffer中。其中$offset是可选项,如果省略$offset,则read()从当前位置的前$length个字节读取到当前位置。可以使用下面的命令查看是否到了文件末尾:
eof(HANDLE);
  如果返回一个非零值,则说明已经到达文件的末尾。
  打开文件时可能出错,所以可以使用die()显示出错信息。下面打开一个叫做“test.data”的文件:
open(TESTFILE,"test.data")||die"\n$0Cannotopen$!\n";

流程控制

foreach循环
  在Perl中,可以使用foreach循环来读取数组或其他类似列表结构中的每一行。请看下面的例子:

  1. foreach$morsel(@food)#Visiteachiteminturn
  2. #andcallit$morsel
  3. {
  4.   print"$morsel\n";#Printtheitem
  5.   print"Yumyum\n";#Thatwasnice
  6. }
复制代码


  每次要执行的命令用花括号括出。第一次执行时$morsel被赋予数组@food的第一个元素的值,第二次执行时$morsel被赋予数组@food的第二个元素的值,以此类推直到数组的最后一个元素。

判断运算
  在Perl中任何非零的数字和非空的字符串都被认为是真。零、全为零的字符串和空字符串都为假。

下面是一些判断运算符:
$a==$b如果$a和$b相等,则返回真。
$a!=$b如果$a和$b不相等,则返回真。
$aeq$b如果字符串$a和字符串$b相同,则返回真
$ane$b如果字符串$a和字符串$b不相同,则返回真。

你可以使用逻辑运算符:
($a&&$b)$a与$b。
($a||$b)$a或$b。
!($a)非$a。

for循环
  Perl中的for结构和C语言中的for结构基本一样:

for(initialise;test;inc){
 first_action;
 second_action;
 etc
}

  下面是一个for循环的例子,用来显示从0到9的数字:

  1. for($i=0;$i<10;++$i)#Startwith$i=1
  2. #Doitwhile$i<10
  3. #Increment$ibeforerepeating
  4. {
  5.   print"$i\n";
  6. }
复制代码

while和until循环
  下面是一个while和until循环的例子。它从键盘读取输入直到得到正确的口令为止。

  1. #!/usr/local/bin/perl
  2. print"Password?";#Askforinput
  3. $a=<STDIN>;#Getinput
  4. chop$a;#Removethenewlineatend
  5. while($ane"fred")#Whileinputiswrong...
  6. {
  7.   print"sorry.Again?";#Askagain
  8.   $a=<STDIN>;#Getinputagain
  9.   chop$a;#Chopoffnewlineagain
  10. }
复制代码


当输入和口令不相等时,执行while循环。
你也可以在执行体的末尾处使用while和until,这时需要用do语句:

  1. #!/usr/local/bin/perl
  2. do
  3. {
  4.   "Password?";#Askforinput
  5.   $a=<STDIN>;#Getinput
  6.   chop$a;#Chopoffnewline
  7. }
  8. while($ane"fred")#Redowhilewronginput
复制代码

条件结构
  Perl也允许if/then/else表达式。请看下面的例子:

  1. if($a){
  2.   print"Thestringisnotempty\n";
  3. }
  4. else{
  5.   print"Thestringisempty\n";
  6. }
复制代码

注意在Perl中,空字符被认为是假。

  If结构中也可以使用嵌套结构:

  1. if(!$a)#The!isthenotoperator
  2. {
  3.   print"Thestringisempty\n";
  4. }
  5. elsif(length($a)==1)#Ifabovefails,trythis
  6. {
  7.   print"Thestringhasonecharacter\n";
  8. }
  9. elsif(length($a)==2)#Ifthatfails,trythis
  10. {
  11.   print"Thestringhastwocharacters\n";
  12. }
  13. else#Now,everythinghasfailed
  14. {
  15.   print"Thestringhaslotsofcharacters\n";
  16. }
复制代码



字符匹配

  Perl字符匹配功能十分强大。字符匹配功能的核心是规则表达式(RE),也就是字符匹配过程中涉及到的格式。=~运算符用来进行格式匹配和替换。例如:
如果:
$s='Oneifbylandandtwoifbysea';
则:
if($s=~/ifbyla/){print"YES"}
else{print"NO"}
  将会显示YES,因为ifbyla在字符串$s中。再例如:
if($s=~/one/){print"YES"}
else{print"NO"}
  将显示NO,因为RE是对大小写敏感的。如果使用i选项,则将忽略大小写,则下面会显示出YES:
if($s=~/one/i){print"YES"}
else{print"NO"}

下面列出了RE中许多具有特殊意义的字符:

 . 任何字符除了换行符(\n)
 ^ 一行和一个字符串的开始
 $ 一行和一个字符串的结束
 * 其前一个字符重复零次或多次
 + 其前一个字符重复一次或多次
 ? 其前一个字符重复零次或一次

例如:
if($x=~/l.mp/){print"YES"}
对于$x=“lamp”、“lump”、“slumped”将显示YES,但对于$x=“lmp”或“lessamperes”将不会显示YES。

再看下面的例子:
/fr.*nd/  匹配frnd、friend、frontandback。
/fr.+nd/  匹配frond、friend、frontandback。但不匹配frnd。
/10*1/   匹配11、101、1001、100000001。
/b(an)*a/  匹配ba、bana、banana、banananana。
/flo?at/  匹配flat和float,但不匹配flooat。

方括号用来匹配其中的任何字符。方括号中的-符号用来表明在什么之间,^符号表明非的意思。
[0123456789] 匹配任何单个的数字。
[0-9]     匹配任何单个的数字。
[a-z]+    匹配任何由小写字母组成的单词。
[^0-9]    匹配任何非数字的字符。

反斜杠还是用于转义。如果你想匹配+、?、.、*、^、$、(、)、[、]、{、}、|、\和/这些字符,则其前面必须用反斜杠(\)。例如:
/10.2/    匹配10Q2、1052和10.2。
/10\.2/    匹配10.2,但不和10Q2或1052匹配。
/\*+/     匹配一个或多个星号。
/A:\\DIR/   匹配A:\DIR。
/\/usr\/bin/ 匹配/usr/bin。

下面还有一些特殊意义的字符:
\n 换行。
\t 制表符。
\w 任何字母和数字和[a-zA-Z0-9_]一样。
\W 任何非字母和数字和[^a-zA-Z0-9_]一样。
\d 任何数字和[0-9]一样。
\D 任何非数字和[^0-9]一样。
\s 任何空白字符:空格、tab、换行等。
\S 任何非空白字符。
\b 单词边界,只对[]以外有效。
\B 非单词边界。

替换
  Perl可以使用s函数利用字符匹配的结果进行字符替换。s函数和vi编辑器的作用基本一样。这时还是使用字符匹配运算符=~,例如:将字符串$sentence中所出现的london用London替换,可以使用如下的命令:
$sentence=~s/london/London/
命令的返回值是所做的替换数目。

  但此命令只能替换第一个出现的london。如果希望将所有在字符串中出现的london都用London替换,则应使用/g选项:
s/london/London/g
  此命令的对象是$_变量,也就是当前的缺省变量。

  如果希望还能替换类似lOndon、lonDON、LoNDoN的字符串,可以使用:
s/[Ll][Oo][Nn][Dd][Oo][Nn]/London/g

  但更为简单的方法是使用i选项,也就是忽略大小写:
s/london/London/gi

翻译
  tr函数允许逐字地翻译。下面的命令使得字符串$sentence中的a、b、c分别由e、f、d代替:

$sentence=~tr/abc/efd/

结果返回所做的替换数目。
  大多数RE中的特殊字符在tr函数中并不存在。例如下面的命令用来计算字符串$sentence中星号(*)的数目,并将结果存储在$count:

$count=($sentence=~tr/*/*/);

子过程

子过程的定义
  Perl语言也可以定义自己的子过程。子过程的定义如下:
submysubroutine{
 print"Notaveryinterestingroutine\n";
 print"Thisdoesthesamethingeverytime\n";
}
下面的几种方法都可以调用这个子过程:
&mysubroutine;#Callthesubroutine
&mysubroutine($_);#Callitwithaparameter
&mysubroutine(1+2,$_);#Callitwithtwoparameters

参数
  调用一个子过程时,所有的参数都传送到了数组@_中。下面子过程的例子显示出所有的
参数:
subprintargs{
 print"@_\n";
}
&printargs("perly","king");#Exampleprints"perlyking"
&printargs("frog","and","toad");#Prints"frogandtoad"

返回值
  下面的例子返回两个输入参数的最大值:
  1. submaximum{
  2. if($_[0]>$_[1]){
  3.   $_[0];
  4. }
  5. else{
  6.   $_[1];
  7.   $biggest=&maximum(37,24);#Now$biggestis37
  8. }
复制代码


例子

最后请看一个Perl语言的完整的例子。

  此程序从一个记录学生信息的文件stufile和一个记录学生成绩的文件scorefile中生成一个
学生成绩报告单。
  输入文件stufile由学生ID、姓名和年级三个字段组成,其间由分号隔开:
123456;Washington,George;SR
246802;Lincoln,Abraham"Abe";SO
357913;Jefferson,Thomas;JR
212121;Roosevelt,Theodore"Teddy";SO

  文件scorefile由学生ID、科目号、分数三个字段组成,由空格隔开:
123456 1 98
212121 1 86
246802 1 89
357913 1 90
123456 2 96
212121 2 88
357913 2 92
123456 3 97
212121 3 96
246802 3 95
357913 3 94

  程序应该输出如下的结果:

Stu-IDName...123Totals:
357913Jefferson,Thomas909294276
246802Lincoln,Abraham"Abe"8995184
212121Roosevelt,Theodore"Teddy"868896270
123456Washington,George989697291
Totals:363276382

  源程序如下:

  1. #!/usr/local/bin/perl
  2. #Gradebook-demonstratesI/O,associative
  3. #arrays,sorting,andreportformatting.
  4. #Thisaccommodatesanynumberofexamsandstudents
  5. #andmissingdata.Inputfilesare:
  6. $stufile='stufile';
  7. $scorefile='scorefile';
  8. #Iffileopenssuccessfully,thisevaluatesas"true",andPerl
  9. #doesnotevaluaterestofthe"or""||"
  10. open(NAMES,"<$stufile")||die"Can'topen$stufile$!";
  11. open(SCORES,"<$scorefile")||die"Can'topen$scorefile$!";
  12. #Buildanassociativearrayofstudentinfo
  13. #keyedbystudentnumber
  14. while(<NAMES>){
  15.   ($stuid,$name,$year)=split(':',$_);
  16.   $name{$stuid}=$name;
  17.   if(length($name)>$maxnamelength){
  18.     $maxnamelength=length($name);
  19.   }
  20. }
  21. closeNAMES;
  22. #Buildatablefromthetestscores:
  23. while(<SCORES>){
  24.   ($stuid,$examno,$score)=split;
  25.   $score{$stuid,$examno}=$score;
  26.   if($examno>$maxexamno){
  27.   $maxexamno=$examno;
  28.   }
  29. }
  30. closeSCORES;
  31. #Printthereportfromaccumulateddata!
  32. printf"%6s%-${maxnamelength}s",
  33. 'Stu-ID','Name...';
  34. foreach$examno(1..$maxexamno){
  35.   printf"%4d",$examno;
  36. }
  37. printf"%10s\n\n",'Totals:';
  38. #Subroutine"byname"isusedtosortthe%namearray.
  39. #The"sort"functiongivesvariables$aand$bto
  40. #subroutinesitcalls.
  41. #"xcmpy"functionreturns-1ifx<y,0ifx=y,
  42. #+1ifx>y.SeethePerldocumentationfordetails.
  43. subbyname{$name{$a}cmp$name{$b}}
  44. #OrderstudentIDssothenamesappearalphabetically:
  45. foreach$stuid(sortbynamekeys(%name)){
  46.   #Printscoresforastudent,andatotal:
  47.   printf"%6d%-${maxnamelength}s",
  48.   $stuid,$name{$stuid};
  49.   $total=0;
  50.   foreach$examno(1..$maxexamno){
  51.     printf"%4s",$score{$stuid,$examno};
  52.     $total+=$score{$stuid,$examno};
  53.     $examtot{$examno}+=$score{$stuid,$examno};
  54.   }
  55.   printf"%10d\n",$total;
  56. }
  57. printf"\n%6s%${maxnamelength}s","Totals:";
  58. foreach$examno(1..$maxexamno){
  59.   printf"%4d",$examtot{$examno};
  60. }
  61. print"\n";
  62. exit(0);
复制代码



正则表达式

正则表达式

  正则表达式在 shell、工具程序、Perl 语言中有非常重要的地位。正则表达式通过一些特殊符号表示特定的字符串模式。常见的特殊字符包括:

  1. 字符                功能
  2. ^                   置于待搜索的字符串之前,匹配行首的字
  3. $                   置于待搜索的字符串之后,匹配行末的字
  4. \<                  匹配一个字的字头
  5. \>                  匹配一个字的字尾
  6. .                   匹配任意单个正文字符
  7. [str]               匹配字符串 str 中的任意单个字符
  8. [^str]              匹配不在字符串 str 中的任意单个字符
  9. [a-c]               匹配从 a 到 c 之间的任一字符
  10. *                   匹配前一个字符的 0 次或多次出现
  11. \                   忽略特殊字符的特殊含义,将其看作普通字符

  12. 扩充的特殊字符:
  13. 字符                功能
  14. +                   重复匹配前一项 1 次以上
  15. ?                   重复匹配前一项 0 次或 1 次
  16. {j}                 重复匹配前一项 j 次
  17. {j, }               重复匹配前一项 j 次以上
  18. {, k}               重复匹配前一项最多 k 次
  19. {j, k}              重复匹配前一项 j 到 k 次
  20. s | t               匹配 s 或 t 中的一项
  21. (exp)               将表达式 exp 作为单项处理

复制代码
回复 支持 反对

使用道具 举报

发表于 2005-3-27 22:29:17 | 显示全部楼层
好长哦!~下次再看!!谢谢分享
回复 支持 反对

使用道具 举报

发表于 2005-4-3 05:04:45 | 显示全部楼层
感谢楼主这么好的文章本人正想学习SHELL对我有了很大的帮助谢了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表