收藏 分享(赏)

UNIX初级讲座Ch07Perl编程语言.ppt

上传人:hwpkd79526 文档编号:10135990 上传时间:2019-10-13 格式:PPT 页数:80 大小:218.50KB
下载 相关 举报
UNIX初级讲座Ch07Perl编程语言.ppt_第1页
第1页 / 共80页
UNIX初级讲座Ch07Perl编程语言.ppt_第2页
第2页 / 共80页
UNIX初级讲座Ch07Perl编程语言.ppt_第3页
第3页 / 共80页
UNIX初级讲座Ch07Perl编程语言.ppt_第4页
第4页 / 共80页
UNIX初级讲座Ch07Perl编程语言.ppt_第5页
第5页 / 共80页
点击查看更多>>
资源描述

1、UNIX操作系统,北京邮电大学 电信工程学院多媒体中心,2019/10/13,BUPT MultiMedia Hop Lee,2,第七章 Perl编程语言,概述 数据类型 标量 列表数组 关联数组 内部变量,流控 基本I/O 文件操作 格式 函数,2019/10/13,BUPT MultiMedia Hop Lee,3,Perl 的全称是:Practical Extraction and Report Language即“实用摘录和报告语言”。其开发者和唯一的维护者是Larry Wall。 Perl的设计目标是帮助Unix用户完成一些常见的任务,而这些任务对于Shell来说过于复杂。 Perl

2、语言中包含了C,C+,shell,script, sed,awk 这几个语言的语法,它最初的目的就是用来取代UNIX中sed/awk与 脚本语言的组合,用来汇整信息,产生报表。因此 Perl语言要远远比前面讲的Bash复杂和功能强大。,2019/10/13,BUPT MultiMedia Hop Lee,4,Perl简洁的结构允许你开发一些非常漂亮的、一步到位的方案或通用的工具。 由于Perl的高度可移植性,你也可以将这些工具用于其他的任务。 Perl是免费的,并且各种常见的操作系统上都存在相应版本的发行。,2019/10/13,BUPT MultiMedia Hop Lee,5,一、概述,P

3、erl脚本的第一行必须是: #!/usr/bin/perl Perl的注释和Shell一样,以#开始 Perl更象一个编译器和解释器的组合。Perl程序在运行之前将进行扫描和分析,但是又不产生庞大的目标代码。未来的版本将能够缓存已编译的代码。 Perl的所有简单语句均以分号结束。,2019/10/13,BUPT MultiMedia Hop Lee,6,Perl的数据类型主要有三种:标量数据、数组(列表)和关联数组。,2019/10/13,BUPT MultiMedia Hop Lee,7,二、标量数据,所谓标量就是非矢量、非数组的数据。 Perl中的标量变量以美元符号“$“和一个字母开始,后

4、面可以跟字母、数字和下划线,Perl的变量区分大小写,因此$a和$A是代表不同的变量。和Bash中不同的是Perl语言中的变量即使是在最初赋值的时候也必须在变量前面加上“$“符号,而且Perl不要求“=“左右必须没有空格。,2019/10/13,BUPT MultiMedia Hop Lee,8,Perl所处理的标量数据包括数字和字符串两大类。 Perl的数值型数据只有一种类型:浮点数,所有的整数都将当作等效的浮点数来处理。浮点型常量的表示方式和C语言里一样。,2019/10/13,BUPT MultiMedia Hop Lee,9,Perl的字符串类型数据的取值可以是整个ASCII表,并且其

5、长度遵循“无内置限制”的原则从0直到填满内存。 字符串常量有两种形式:单引号字符串和双引号字符串。 单引号字符串:单引号用于表示字符串的边界,其中可以包含任意字符并且取消所有元字符的特殊含义(唯一的例外是前后相连的或);,2019/10/13,BUPT MultiMedia Hop Lee,10,双引号字符串:类似于C语言里的字符串,其中的反斜线用于表示特定的控制字符的开始;并且其中的变量将被置换。 运算符 算数运算符 +, -, *, /, *, % 逻辑运算符 =, , ,2019/10/13,BUPT MultiMedia Hop Lee,11,字符串运算符 . 串接运算符 x 复制运算

6、符 eq, ne, lt, gt, le, ge, cmp字符串逻辑运算符 数值和字符串之间的转换 如果某个字符串的值被用于数值运算符的运算域,在Perl将自动将其转换为一个十进制浮点数,并且去掉开头的和末尾的非数字元素。 同样的转换发生在某个数值作为字符串使用时。,2019/10/13,BUPT MultiMedia Hop Lee,12,赋值运算符: =, +=, -=, *=, /=, %=, *=, .=, x=, +(左、右), - (左、右) 特殊运算符: $w?$x:$y 如果$w为真,则返回$x;如果$w为假,则返回$y 。 ($x$y) 返回从$x到$y之间的值。 chop(

7、$x) 将$x的字符串值的最后一个字符去掉,2019/10/13,BUPT MultiMedia Hop Lee,13,例: #!/usr/bin/perl $folks=“100“; print “$folks = $folks n“; print $folks = $folks n; print “nn BEEP! a LSOME BLANK ELINES HERE nn“; $date = date +%D; print “Today is $date n“; chop $date; print “Date after chopping off carriage return: “.$d

8、ate.“n“;,2019/10/13,BUPT MultiMedia Hop Lee,14,注意实际程序中不应该包括行号。 其输出结果如下: $folks = 100 $folks = $folks n BEEP! some blank LINES HERE Today is 03/29/96 Date after chopping off carriage return: 03/29/96 第3行显示$folks的值。$之前必须使用换码符,以便Perl显示字符串$folks而不是$folks的值100。 第4行使用的是单引号,结果Perl不解释其中的任何内容,只是原封不动地将字符串显示出来

9、。 第6行使用的是(),则date +%D命令的执行结果存储在标量$date 中。,2019/10/13,BUPT MultiMedia Hop Lee,15,上例中使用了一些有特殊意义的字符,下面列出这些字符的含义: n 换行。 r 回车。 t 制表符。 a 蜂鸣声。 b Backspace。 LE 将L和E之间的字符转换成小写。,2019/10/13,BUPT MultiMedia Hop Lee,16,l 将其后的字符转换成小写。 U E 将U和E之间的字符转换成大写。 u 将其后的字符转换成大写。 cC 插入控制字符C。 x# 十六进制数#。 0ooo 八进制数ooo。 反斜杠。 按原

10、样输出下一个字符,例如:$ 输出$。,2019/10/13,BUPT MultiMedia Hop Lee,17,简单变量是标量,是Perl处理的最简单的数据类型。标量可以是数字(如2,3或2.5e6), 也可以是字符串。,2019/10/13,BUPT MultiMedia Hop Lee,18,另外在Perl语言里,我们常会看到my这样的变量定义,如: my $a = “local var“; #表示$a是一个程序块的局部变量。,2019/10/13,BUPT MultiMedia Hop Lee,19,三、数组(列表),数组(array)是标量数据的有序列表。每个数组元素都是具有标量值的

11、单独的标量变量。 数组可以有任意多个元素。 数组变量以开头。 数组的下标从0开始,你可以使用方括号引用数组的下标。,2019/10/13,BUPT MultiMedia Hop Lee,20,数组常量是位于括号内用逗号分开的一系列值,这些值可以是标量常量或是表达式。 数组的元素可以包含“”运算符,这个运算符以1为增量创建一个从左边标量值开始到右边标量值结束的数值列表。如果右边的标量小于左边的标量则产生空表。如果前后两个值的差值不是整数,则表尾的元素是不超出范围的最后一个值。,2019/10/13,BUPT MultiMedia Hop Lee,21,数组运算符 赋值:= fred=(1,2,3

12、); barney=fred; huh=1; fred=(“one”,”two”); barney=(4,5,fred,6,7); barney=(8,barney); barney=(barney,”last”);,2019/10/13,BUPT MultiMedia Hop Lee,22,($a,$b,$c)=(1,2,3); ($a,$b)=($b,$a); ($d,fred)=($a,$b,$c); ($e,fred)=fred; #after that, fred=($c), $e=$b #注意:(fred,$e)=fred;将导致$e为undef 如果赋值号两边的表中元素数目不等,

13、则等号右边任何多出来的值都被截去;等号左边多出来的变量都被赋为undef。,2019/10/13,BUPT MultiMedia Hop Lee,23,如果把数组变量赋给标量,则标量变量的值就是数组的长度。 赋值表达式的值为数组变量得到的值: fred=($barney=(2,3,4); fred=barney=(2,3,4); 上述两式结果相同。,2019/10/13,BUPT MultiMedia Hop Lee,24,数组元素的引用 数组元素的下标都是从0开始,增量为1。 下标运算符为。 ($fred0,$fred1)=($fred1,$fred0); 片段(slice): 对同一个数组

14、的一部分元素的访问可以使用slice表达式: fred0,1=fred1,0;#对调,2019/10/13,BUPT MultiMedia Hop Lee,25,fred0,1,2=fred1,1,1;#将前三个元素都变成第二个元素的值。 who=(“fred”,”barney”,”betty”)1,2; #等效于who=(”barney”,”betty”); fred=(7,8,9);barney=(2,1,0);backfred=fredbarney;#(9,8,7) fred=(1,2,3);$fred3=“hi”;$fred6=“ho”;#(1,2,3,”hi”,undef,undef

15、,”ho”),2019/10/13,BUPT MultiMedia Hop Lee,26,可以使用$#fred来得到数组fred的末尾元素的索引值;并通过对他赋值来改变数组fred的长度。 push()和pop()运算符: push(myarr, $newvalue); $oldvalue=pop(myarr); shift()和unshift()运算符 类似与push()和pop(),只不过他们是对数组左边的元素操作。,2019/10/13,BUPT MultiMedia Hop Lee,27,reverse()运算符 返回数组元素反序后的结果,但是不改变参数。 sort()运算符 将所有参

16、数都当成是ASCII字符串,按升序方式排序,返回排序后的结果但是不改变原列表。 chop()运算符 可以删去数组中每个元素的最后一个字符。,2019/10/13,BUPT MultiMedia Hop Lee,28,四、关联数组,关联数组也是由一系列标量数据组成的集合,它与列表数组的区别是它的索引值不再是非负的整数而是任意的标量,这些表示索引的标量称为关键字(key)。 实际上关联数组是数据结构里的散列表。 关联数组的元素没有特定的顺序。,2019/10/13,BUPT MultiMedia Hop Lee,29,关联数组常量: 关联数组常量由含有偶数个元素的列表数组表示: %fred=(“a

17、aa,”bbb”,”234.5”,456.7)将生成一个含有两个键值对的关联数组。 在展开表中的键值对的顺序可以是任意的,其在内存中的具体顺序是由Perl建立的,用于提高访问单个元素的效率。,2019/10/13,BUPT MultiMedia Hop Lee,30,关联数组变量名以%号开头。 在创建和访问关联数组时只需使用对数组元素的引用即可: 关联数组%arr的每个元素都可被$arr$key引用。 关联数组操作符 keys()操作符 keys(%arr)将生成由关联数组%arr中的所有关键字组成的列表数组。,2019/10/13,BUPT MultiMedia Hop Lee,31,其中的

18、圆括号是可选的 例: foreach $key(keys %fred) print “at $key we get $fred$keyn”; 在标量环境中,keys()返回关联数组中键值对的个数。 values()操作符 values(%arr)返回由%arr中的值构成的列表数组。 圆括号是可选的。,2019/10/13,BUPT MultiMedia Hop Lee,32,each()操作符 each(%arr)返回%arr中的一个键值对列表,对同一关联数组再次使用此操作符将返回下一个键值对,当处理到数组的最后一个元素之后,将返回一个空表。 例:while($first,$last)=eac

19、h(%arr)print “The last name of $first is $lastn”; 给整个数组赋新值将使each()操作符重置到数组的起始位置。,2019/10/13,BUPT MultiMedia Hop Lee,33,delete()操作符 delete的操作数是关联数组的引用。用于删除指定的键值对。,2019/10/13,BUPT MultiMedia Hop Lee,34,五、内部变量,2019/10/13,BUPT MultiMedia Hop Lee,35,2019/10/13,BUPT MultiMedia Hop Lee,36,2019/10/13,BUPT M

20、ultiMedia Hop Lee,37,2019/10/13,BUPT MultiMedia Hop Lee,38,2019/10/13,BUPT MultiMedia Hop Lee,39,2019/10/13,BUPT MultiMedia Hop Lee,40,例1: $_ = abcdefghi; /def/; print “$:$ ,2019/10/13,BUPT MultiMedia Hop Lee,41,$SIGINT = # ignore SIGQUIT,2019/10/13,BUPT MultiMedia Hop Lee,42,六、流控,语句块:位于一对花括号之间的语句序列

21、。 statement;statement;statement; ,2019/10/13,BUPT MultiMedia Hop Lee,43,if语句: if(expression 1) statements block 1 elsif(expression 2) statements block 2 elsestatements block n unless语句: unless=if not,2019/10/13,BUPT MultiMedia Hop Lee,44,控制表达式expression是作为字符串计算的,如果是空串或只包括单个字符“0”,则表达式为假,否则为真。 例: 0 #

22、false 1-1 # false 1 # true “” # false “1” # true “00” # true “0.000” # true undef # false,2019/10/13,BUPT MultiMedia Hop Lee,45,while语句: while(expressions) statements block until语句: until(expressions) statement block ,2019/10/13,BUPT MultiMedia Hop Lee,46,for语句: for(expr1; expr2; expr3)statement blo

23、ck foreach语句: foreach $var (arr_expr) statement block ,2019/10/13,BUPT MultiMedia Hop Lee,47,arr_expr可以是任意表达式。 如果arr_expr是单个数组变量的引用,那么在循环体中对$var的修改将直接作用于相应的数组元素。即这时是byref引用。 例: a=(3,5,7,9) foreach $one (a) $one *= 3; # now a is (9,15,21,27),2019/10/13,BUPT MultiMedia Hop Lee,48,last 终止最近的封闭循环块 例: wh

24、ile(expr) statement blocklast; # last to here,2019/10/13,BUPT MultiMedia Hop Lee,49,next 跳过最近的封闭循环块中的剩余部分,进行下一次循环 例: while(expr) statement block 1next;statement block 2# next to here ,2019/10/13,BUPT MultiMedia Hop Lee,50,redo 跳到当前循环块的最开始位置 例: while(expr) # redo to herestatement blockredo; ,2019/10/

25、13,BUPT MultiMedia Hop Lee,51,label block 使用label给语句块起一个名字,用于last和next语句 使用标号只能跳出,不能跳入,2019/10/13,BUPT MultiMedia Hop Lee,52,表达式简写方式1(倒置) exp2 if exp1; exp2 unless exp1; exp2 while exp1; exp2 until exp1; 先对exp1求值,并据此判断是否执行exp2,2019/10/13,BUPT MultiMedia Hop Lee,53,表达式简写方式2(,2019/10/13,BUPT MultiMedi

26、a Hop Lee,54,七、基本I/O,STDIN 使用操作符表示从标准输入读取数据,直到遇到$/为止。和类似,但是可以从Perl的命令行参数文件名指定的输入文件中读取记录。,2019/10/13,BUPT MultiMedia Hop Lee,55,STDOUT print()操作符,返回成功(1)或失败(0) printf(fmt_str, value_list),类似于C和awk中的格式。,2019/10/13,BUPT MultiMedia Hop Lee,56,八、文件操作,文件句柄 已经见过的有STDIN,STDOUT,STDERR 文件句柄的打开和关闭 open(FILEHAN

27、DLE,”file_name”); 表示以读写覆盖方式打开文件。 close(FILEHANDLE); 关闭文件句柄。,2019/10/13,BUPT MultiMedia Hop Lee,57,die()操作符在可选的圆括号里带有一列表,以标准错误的方式输出该列表,然后以非零的UNIX退出状态结束该Perl进程。 如果die()的列表的最后没有一个n,则退出时的信息中自动带有Perl程序的名字及行数。,2019/10/13,BUPT MultiMedia Hop Lee,58,例: open(IN,$a)|die “Cannot open $a for reading.”; open(OUT

28、,”$b”)|die “Cannot create $b.”; while()print OUT $_; close(OUT); close(IN);,2019/10/13,BUPT MultiMedia Hop Lee,59,文件测试: -r Readable for euid -w Writable for euid -x Executable for euid -o Owner by euid -R Readable for ruid -W Writable for ruid -X Executable for ruid -O Owner by ruid,2019/10/13,BUPT

29、MultiMedia Hop Lee,60,-e Exist -z Exist and size=zero -s Exist and size!=zero -f Pure file -d Directory -l Link file -S Socket -p Named pipe,2019/10/13,BUPT MultiMedia Hop Lee,61,-b Block device file -c Character device file -uN uid is N -gN gid is N -k Has sticky bit -t isatty() is true -T Text fil

30、e -B Binary file,2019/10/13,BUPT MultiMedia Hop Lee,62,-M Up to todays time in days from LMT, precession in second -A from LAT -C from inode changed time stat()和lstat()操作符 Stat()的操作数是一个文件句柄,返回值是有13个元素的数组:,2019/10/13,BUPT MultiMedia Hop Lee,63,($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $at

31、ime, $mtime, $ctime, $blksize, $blocks) = stat(); $dev device $ino inode $mode access mode $nlink number of hard links $uid user id of owner,2019/10/13,BUPT MultiMedia Hop Lee,64,$gid group id of owner $rdev device type (if inode device) $size total size, in bytes $atime last access time $mtime last

32、 modification time $ctime last change time $blksize block size for file system I/O $blocks number of blocks allocated,2019/10/13,BUPT MultiMedia Hop Lee,65,例: studentApple Perl$ ./stat.pl0 dev 7731 ino 952682 mode 332773 nlink 14 uid 5005 gid 5006 rdev 07 size 143508 atime 10388939949 mtime 10388939

33、9410 ctime 103889399411 blksize 409612 blocks 32,2019/10/13,BUPT MultiMedia Hop Lee,66,studentApple Perl$ ls -l code -rwxrwxr-x 1 student student 14350 12 3 13:39 code studentApple Perl$ more stat.pl #!/usr/bin/perl arr1=(“dev“, “ino“, “mode“, “nlink“, “uid“, “gid“, “rdev“, “size“, “atime“, “mtime“,

34、 “ctime“, “blksize“, “blocks“); arr=stat(“/home/student/Examples/Perl/code“); for($i = 0; $i 13; $i = $i + 1) printf(“%3d %8s %sn“, $i, $arr1$i, $arr$i); ,2019/10/13,BUPT MultiMedia Hop Lee,67,对于一个link文件来说,stat()返回的是符号链接所指之处的信息,如果你需要关于该符号链接本身的信息,可以使用lstat()。 这两个操作符默认的操作数是$_。 例: studentApple Perl$ ln

35、 s code lcode studentApple Perl$ ls -l *code -rwxrwxr-x 1 student student 14350 12月 3 13:39 code lrwxrwxrwx 1 student student 4 12月 3 13:45 lcode - code,2019/10/13,BUPT MultiMedia Hop Lee,68,studentApple$ ./stat.pl 0 dev 7731 ino 952682 mode 332773 nlink 14 uid 5005 gid 5006 rdev 07 size 143508 atim

36、e 10388939949 mtime 103889399410 ctime 103889434811 blksize 409612 blocks 32,studentApple$ ./lstat.pl 0 dev 7731 ino 952692 mode 414713 nlink 14 uid 5005 gid 5006 rdev 07 size 48 atime 10388944889 mtime 103889435710 ctime 103889435711 blksize 409612 blocks 0,2019/10/13,BUPT MultiMedia Hop Lee,69,每次进

37、行文件测试操作时,Perl都将向系统申请一个该文件的stat缓冲区。在指定的_文件句柄上进行文件操作就可以让Perl直接使用前一次文件测试的缓冲区。 例: if(-r $filevar ,2019/10/13,BUPT MultiMedia Hop Lee,70,九、格式,Perl提供了简单的报告书写模板的概念,叫做格式(format)。Format定义了常量部分(每列的开头、标签、相应的正文或其它)以及变量部分(报告中的数据)。 使用格式需要做三件事: 定义格式 提取数据,将其打印到格式的变量部分 申请格式,2019/10/13,BUPT MultiMedia Hop Lee,71,定义格式

38、 格式定义可以出现在程序中的任何位置: format fmt_name = FORMLIST .,2019/10/13,BUPT MultiMedia Hop Lee,72,第一行包括保留字format,以及该格式的名称(缺省为STDOUT)和一个等号。 下面是“模板”本身,可以有任意行文本。每一行文本都应该是下述三种之一: 第一列以#开头的注释 格式字符串给出每个输出行的格式 用于匹配格式字符串的参数列表,2019/10/13,BUPT MultiMedia Hop Lee,73,格式字符串中的普通文本原样输出。 以开头的是字段格式,在字段格式中的字符,|分别表示左、右和中央对齐。字符的个数

39、表明了相应参数的输出值的宽度,如果值的宽度过大,将被截断,过小则填充空格。,2019/10/13,BUPT MultiMedia Hop Lee,74,例: studentApple Perl$ more passwd_report.pl #!/usr/bin/perl # a report on the /etc/passwd file format PWDLIST_TOP =Passwd File Page $% No. Name Login Office Uid Gid Home - . format PWDLIST = $., $name, $login, $office, $uid,

40、 $gid, $home .,2019/10/13,BUPT MultiMedia Hop Lee,75,open(PWDLIST, “passwd_report“) | die “Cant create output file.“; open(PWDFILE, “/etc/passwd“) | die “Cant open data file.“; # Change the page height to 10 lines. $old = select(PWDLIST); $= = 18; select($old);while() chop;($login, $pwd, $uid, $gid,

41、 $name, $home, $office)=split(/:/);write PWDLIST; close(PWDFILE); close(PWDLIST);,2019/10/13,BUPT MultiMedia Hop Lee,76,输出文件为:Passwd File Page 1 No. Describe Login_Name Shell Uid Gid Home_Dir - 1 root, root /bin/bash 0 0 /root 2 bin bin 1 1 /bin 3 daemon daemon 2 2 /sbin 4 adm adm 3 4 /var/adm 5 lp

42、lp 4 7 /var/spool/lpd 15 FTP User ftp 14 50 /home/ftp L Passwd File Page 5 No. Describe Login_Name Shell Uid Gid Home_Dir - 29 radvd user radvd /bin/false 75 75 / 30 PostgreSQL S postgres /bin/bash 26 26 /var/lib/pgsql 31 Apache apache /bin/false 48 48 /var/www 32 squid /dev/null 23 23 /var/spool/sq

43、uid 33 pcap /sbin/nolo 77 77 /var/arpwatch 34 UNIX Student student /bin/bash 500 500 /home/student 35 Hop Lee hop /bin/bash 501 501 /home/hop,2019/10/13,BUPT MultiMedia Hop Lee,77,#.#表示数值的格式:六位整数部分,两位小数部分。 独占一行的 * 表示不截断的多行内容。 另外一种字段格式符是,用于表示填充字段。用于在多行中输出过长的内容,并且可以通过和来控制是否自动调整空行。,2019/10/13,BUPT Mult

44、iMedia Hop Lee,78,例: format PEOPLE = Name : Comment : $name, $comment$comment$comment 如果文本少于三行,将出现空行,可以在前面添加符号自动去除空行。 如果文本多于三行,将被截断,可以在前面添加符号自动增长并自动去除空行。,2019/10/13,BUPT MultiMedia Hop Lee,79,select()为print()操作指定输出文件句柄,当Perl开始运行时是STDOUT。 select一旦选定了新的句柄,它就始终起作用直到下一个select。,2019/10/13,BUPT MultiMedia Hop Lee,80,十、函数大全,详见PerlFunction.doc,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报