版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 PAGE 28某某大学课程设计报告课程名称: 操作系统课程设计设计题目: 读者写者问题 系 别: 计算机系 专 业: 计算机科学与技术 组 别: 第四组 学生姓名: 某某某 学 号: 起止日期: 指导教师: 目 录TOC o 1-3 h u HYPERLINK l _Toc1207 1、需求分析 PAGEREF _Toc1207 1 HYPERLINK l _Toc15876 1.1 课程设计题目 PAGEREF _Toc15876 1 HYPERLINK l _Toc4909 1.2课程任务及要求 PAGEREF _Toc4909 1 HYPERLINK l _Toc28656 1.3课程
2、设计思想 PAGEREF _Toc28656 1 HYPERLINK l _Toc26274 1.4软硬件运行环境及开发工具 PAGEREF _Toc26274 2 HYPERLINK l _Toc13966 2、 概要设计 PAGEREF _Toc13966 2 HYPERLINK l _Toc23028 2.1程序流程图 PAGEREF _Toc23028 2 HYPERLINK l _Toc26802 2.2所用原理 PAGEREF _Toc26802 3 HYPERLINK l _Toc31314 2.2.1 并发原理 PAGEREF _Toc31314 3 HYPERLINK l _
3、Toc20953 2.2.2 互斥操作原理 PAGEREF _Toc20953 4 HYPERLINK l _Toc5185 2.2.3 面向对象编程编程原理 PAGEREF _Toc5185 4 HYPERLINK l _Toc26494 2.2.4 锁机制原理 PAGEREF _Toc26494 5 HYPERLINK l _Toc32283 2.2.5 线程的原理 PAGEREF _Toc32283 6 HYPERLINK l _Toc10808 2.2.6 读者写者问题的一般应用 PAGEREF _Toc10808 6 HYPERLINK l _Toc13105 3、 详细设计 PAG
4、EREF _Toc13105 6 HYPERLINK l _Toc6345 4、 调试与操作说明 PAGEREF _Toc6345 11 HYPERLINK l _Toc11562 5、 课程设计总结与体会 PAGEREF _Toc11562 12 HYPERLINK l _Toc3193 6、 致谢 PAGEREF _Toc3193 13 HYPERLINK l _Toc5481 7、 参考文献 PAGEREF _Toc5481 131、需求分析1.1 课程设计题目 课程设计题目:读者写者问题1.2课程任务及要求编写程序实现读者写者算法(读_写互斥,读_读允许,写写互斥)给出解决方案(包括说
5、明设计实现的原理,采用的数据结构等)画出程序的基本结构框图和流程图分析说明每一部分程序的的设计思路实现源代码按期提交完整的程序代码和可执行程序根据要求完成课程设计报告总结1.3课程设计思想 读者-写者问题是一个经典的并发程序设计问题。有两组并发进程:读者和写者,共享文件F,要求:允许多个读者同时对文件执行读操作;只允许一个写者对文件执行写操作;任何写者在完成写操作之前不允许其他读者或写者工作;写者在执行写操作前,应让已有的写者和读者全部退出。 单纯使用信号量不能解决此问题,必须引入计数器readcount对读进程记数。 为了有效的解决读者写者问题,需要引进读者-写者锁,允许多名读者同时以只读的
6、方式存取有锁保护的对象;或一位写者以写方式存取有锁保护的对象。当一名或多名读者上锁后,此时形成读锁,写者将不能访问有锁保护的对象;当锁被请求者用于写操作时,形成写锁,其他进程的读写操作必须等待。1.4软硬件运行环境及开发工具本课程设计在windows操作系统下,使用java语言完成的。概要设计2.1程序流程图本系统主要有读者和写者两类对象,所以系统主要针对的是这两类对象的操作。读者类对象的流程图如下:图2.1 读者类对象写者类对象的流程图如下:图2.2 写者类对象2.2所用原理2.2.1 并发原理进程的并发是指一组进程的执行在时间上重叠的,所谓的时间重叠是指一个进程执行第一条指令是在另一个进程
7、执行完最后一条指令之前开始的。并发的实质是处理器在几个进程之间的多路复用,并发是对有限物理资源强制行使多用户共享,消除计算机部件之间的互等现象,提高系统资源的利用率。并发进程可能是无关的,也可能是交互的。进程的交互必须是有控制的,否则会出现不正确的计算结果。2.2.2 互斥操作原理 互斥是指若干进程因互相争夺独占型资源而产生的竞争制约关系。 并发进程中与共享变量有关的程序段称为“临界区”,共享变量所代表的资源称为“临界资源”,临界区必须以一种相对于其他进程而言互相排斥的方式执行。如果能够保证一个进程在临界区执行时,不让另一个进程进入相同的临界区,即各进程对共享变量的访问是互斥的,那么,就不会引
8、发与时间有关的错误。 而为了正确而有效地使用临界资源,共享变量的并发进程应遵守临界区调度的三个原则:一次至多有一个进程进入临界区内执行;如果已有进程在临界区中,试图进入临界区的其他进程应等待;进入临界区内进程应在有限时间内退出,以便让等待队列中的一个进程进入。总结起来有三句话:互斥使用,有空让进;忙则等待,有限等待;择一而入,算法可行。2.2.3 面向对象编程编程原理面向对象是一种新兴的程序设计方法,或者说它是一种新的程序设计范型,其基本思想是使用对象,类,继承,封装,消息等基本概念来进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思
9、维方式,强调直接以问题域(现实世界)中的事物为中心来思考问题,认识问题,并根据这些事物的本质特点,把他们抽象地表示为系统中的对象,作为系统的基本构成单位(而不是用一些与现实世界中的事物相关比较远,并且没有对应关系的其他概念来构造系统)。这可以使系统直接地映射问题域,保持问题域中事物及其相互关系的本来面貌。本课程设计中涉及了两个对象,因此用面向对象的语言来编程是适合的。我们这次用到了Java语言。2.2.4 锁机制原理 为了解决读者和写者之间的同步互斥问题,在本课程设计中要用到Java中的锁机制,这样会给编程带来很大的方便。 多线程同步的实现最终依赖锁机制。我们可以想象某一共享资源是一间屋子,每
10、个人都是一个线程。当A希望进入房间时,他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D.就不得不在门外等待,直到A释放锁出来后,B,C,D.中的某一人抢到了该锁(具体抢法依赖于JVM的实现,可以先到先得,也可以随机挑选),然后进屋又将门锁上。这样,任一时刻最多有一人在屋内(使用共享资源)。 Java语言规范内置了对多线程的支持。对于Java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁,别的线程如果希望获得该锁,只能等待这个线程释放锁之后。获得锁的方法只有一个,就是synchronized关键字。用锁操作原语实现互斥 为解决进程互斥进人临界区的问题,可为每
11、类临界区设置一把锁,该锁有打开和关闭两种状态,进程执行临界区程序的操作按下列步骤进行: 关锁。先检查锁的状态,如为关闭状态,则等待其打开;如已打开了,则将其关闭,继续执行步骤的操作。 执行临界区程序。 开锁。将锁打开,退出临界区。 2WAIT,NOTIFY,NOTIFYALL操作原语信号量的初值可以由系统根据资源情况和使用需要来确定。在初始条件下信号量的指针项可以置为0,表示队列为空。信号量在使用过程中它的值是可变的,但只能由WAIT,SIGNAL操作来改变。设信号量为S,对S的WAIT操作记为WAIT(S),对它的SIGNAL操作记为SIGNAL(S)。WAIT(S):顺序执行以下两个动作:
12、1)信号量的值减1,即S=S1;2)如果S0,则该进程继续执行;如果 S0,则把该进程的状态置为阻塞态,把相应的WAITCB连人该信号量队列的末尾,并放弃处理机,进行等待(直至其它进程在S上执行SIGNAL操作,把它释放出来为止)。 SIGNAL(S):顺序执行以下两个动作2.2.5 线程的原理线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。2.2.6 读者写者问题的一般应用 读者写者
13、是典型的并发程序设计问题,它的方法可以普遍用于多线程的同步互斥问题,对于共享资源出现的问题做出了很好的解决,使得事物并发的效率更高,类似的问题还有生产者-消费者问题,理发师问题等等。详细设计本次课程设计采用的是java语言编写,所以要用到类,包括读者类和写者类,它们都是继承的线程Thread类,在主程序中创建类对象(读者对象和写者对象),用线程来实现并发读者类对象和写者类对象的公共属性包括: private static final int NAP_TIME=5; private int readerCount; private int writerCount; private boolean
14、 dbReading; private boolean dbWriting;通过NAP_TIME调整线程随机休息时间通过readercount和writercount来记录读者和写者线程的个数通过dbreading和dbwriting来判断读者和写者的状态,其中读者是靠判断writercount0来实现读写互斥的,同时允许读读同步;而写者是靠判断dbreading=true|dbwriting=true来实现读写互斥和写写互斥的。读写等待是随机的,运用的是math.random()函数程序代码如下: class Database /*读者写者公用的资源Database类*/ private s
15、tatic final int NAP_TIME=5; private int readerCount; /*记录当前的读者个数*/ private int writerCount; /*记录当前的写者个数*/ private boolean dbReading; /*显示是否有读者在读*/ private boolean dbWriting; /*显示是否有写者在写*/ public Database() /*构造函数*/ super(); readerCount=0; writerCount=0; dbReading=false; dbWriting=false; / TODO Auto-
16、generated constructor stub public static void napping() int sleepTime=(int)(NAP_TIME * Math.random(); try Thread.sleep(sleepTime*1000); catch(Exception e) e.printStackTrace(); public synchronized int startRead() while(writerCount0) /*如果有写者在写,那么读者进行等待*/ try System.out.println(reader is waiting); wait
17、(); catch(Exception e) System.out.println(e.toString(); e.printStackTrace(); +readerCount; if(readerCount=1) /*如果有读者读,则设置读状态为true*/ dbReading=true; return readerCount; public synchronized int endReading() -readerCount; if(readerCount=0) /*如果没有有读者读,则设置读状态为false*/ dbReading=false; notifyAll(); /*释放所有等
18、待的线程*/ System.out.println(one reader is done reading. Count=+readerCount); return readerCount; public synchronized void startWriting() +writerCount; while(dbReading=true|dbWriting=true)/*如果有读者在读或者有写者在写,那么写者进行等待*/ try System.out.println(Writer is waiting); wait(); catch(Exception e) System.out.printl
19、n(e.toString(); dbWriting =true; /*有写者在写,则设置写状态为true*/ public synchronized void endWriting() -writerCount; /*由于每次只有一个写者在写,所以结束写操作后写者个数一定为0*/ dbWriting=false; /*没有写者写,则设置写状态为false*/ System.out.println(one writer is done writing. Count=+writerCount); notifyAll(); /*释放所有等待的线程*/ class Reader extends Thr
20、ead /*建立读者类*/ private Database server; private int readerNum; public Reader(int r,Database db) super(); readerNum=r; server=db; public void run() int c; while(true) System.out.println(reader +readerNum+ is sleeping); Database.napping(); System.out.println(reader +readerNum+ wants to read); c=server.
21、startRead(); System.out.println(reader +readerNum+ is reading. Count=+c); Database.napping(); c=server.endReading(); System.out.println(It is reader +readerNum+ who has done reading according to count=+c); class Writer extends Thread /*建立写者类*/ private Database server; private int writerNum; public W
22、riter(int w,Database db) super(); writerNum=w; server=db; public void run() while(true) System.out.println(Writer +writerNum+ is sleeping); Database.napping(); System.out.println(Writer +writerNum+ wants to write); server.startWriting(); System.out.println(Writer +writerNum+ is writing); Database.na
23、pping(); server.endWriting(); System.out.println(It is Writer +writerNum+ who has done writing .); public class DatabaseServer public DatabaseServer() super(); public static void main(String args) Database db=new Database(); /*建立四个读者对象和两个写者对象*/ Reader r1=new Reader(1,db); Reader r2=new Reader(2,db);
24、 Reader r3=new Reader(3,db); Reader r4=new Reader(4,db); Writer w1=new Writer(1,db); Writer w2=new Writer(2,db); r1.start(); r2.start(); r3.start(); w1.start(); r4.start(); w2.start(); 调试与操作说明由于读写等待是随机的所以可能出现多中情况,读写的顺序可能会不一样,以下是几种不同的运行结果:图4.1 读者写者结果一上图中的结果说明:按照读者1、读者2、读者3、写者1、读者4、写者2的顺序进入,最终的执行结果按写者
25、1、写者2、读者2、4、3、1的顺序进行。图4.2 读者写者结果二 上图中的结果说明:按照读者1、读者3、读者2、写者1的顺序进入,最终的执行结果按读者3、读者1、写者2的顺序进行。课程设计总结与体会 通过集体的努力,这次课程设计基本上可以完成功能了,读_写互斥,读_读允许,写写互斥能够实现了,但是还存在一些不足的地方,比如不能够实现读者优先或者写者优先,可能出现长时间等待的情况,在这次课程设计后,我们会继续努力将功能完善。 这次我们的收获就是懂得了使用Java这样的面向对象的语言来实现线程同步互斥问题,知道了Java中的锁机制,这对以后的编程有很大的帮助,同时也进一步加深了对操作系统这类问题
26、的理解。致谢 感谢一学期来老师给我们的教导,让我们对操作系统有了整体的理解,这对我们以后的学习有很大的帮助,对于这次课程设计,老师也给了我们充分的支持和理解,是您对我们的指导帮助我们能够顺利的完成这次课程设计。参考文献费翔林,骆斌. HYPERLINK /Product/BookInTag.aspx?tagName=%e6%95%b0%e6%8d%ae%e5%ba%93%e7%b3%bb%e7%bb%9f%e6%a6%82%e8%ae%ba t _blank 操作系统教程(第4版)M. 北京: 高等教育出版社, 2009.李尊朝,苏军.Java语言程序设计(第二版)M.中国铁道出版社,2008
27、.指导教师评语: 指导教师签名: 年 月 日成绩评定项 目权重成绩1、设计过程中出勤、学习态度等方面0.12、设计技术水平0.43、安全程度及可操作程度0.24、设计报告书写及图纸规范程度0.3总 成 绩 教研室审核意见:教研室主任签字: 年 月 日教学院(系)审核意见: 主任签字: 年 月 日附录资料:不需要的可以自行删除 perl函数应用一、进程处理函数1、进程启动函数函数名eval调用语法eval(string)解说将string看作Perl语句执行。正确执行后,系统变量$为空串,如果有错误,$中为错误信息。例子$print = print (hello,worldn);eval ($p
28、rint);结果输出hello, world函数名system调用语法system(list)解说list中第一个元素为程序名,其余为参数。system启动一个进程运行程序并等待其结束,程序结束后错误代码左移八位成为返回值。例子proglist = (echo, hello,world!);system(proglist);结果输出hello, world!函数名fork调用语法procid = fork();解说创建程序的两个拷贝-父进程和子进程-同时运行。子进程返回零,父进程返回非零值,此值为子程序的进程ID号。例子$retval = fork();if ($retval = 0) # t
29、his is the child process exit; # this terminates the child process else # this is the parent process结果输出无函数名pipe调用语法pipe (infile, outfile);解说与fork合用,给父进程和子进程提供通信的方式。送到outfile文件变量的信息可以通过infile文件变量读取。步骤:1、调用pipe2、用fork将程序分成父进程和子进程3、一个进程关掉infile,另一个关掉outfile例子pipe (INPUT, OUTPUT);$retval = fork();if ($
30、retval != 0) # this is the parent process close (INPUT); print (Enter a line of input:n); $line = ; print OUTPUT ($line); else # this is the child process close (OUTPUT); $line = ; print ($line); exit (0);结果输出$programEnter a line of input:Here is a test lineHere is a test line$函数名exec调用语法exec (list)
31、;解说与system类似,区别是启动新进程前结束当前程序。常与fork合用,当fork分成两个进程后,子进程用exec启动另一个程序。例子 结果输出函数名syscall调用语法syscall (list);解说调用系统函数,list第一个元素是系统调用名,其余为参数。如果参数是数字,就转化成C的整型数(type int)。否则传递字符串的指针。详见UNIX的帮助或Perl文档。使用syscall必须包含文件syscall.pl,即:require (syscall.ph); 例子结果输出2、进程终止函数函数名Die调用语法die (message);解说终止程序并向STDERR输出错误信息。m
32、essage可以为字符串或列表。如果最后一个参数不包含换行符,则程序文件名和行号也被输出。例子die (Cannot open input file);结果输出Cannot open input file at myprog line 6.函数名warn调用语法warn (message);解说与die类似,区别是不终止程序。例子warn(Danger! Danger!n);结果输出Danger! Danger!函数名exit调用语法exit (retcode);解说终止程序并指定返回值。例子exit(2);结果输出无函数名kill调用语法kill (signal, proclist);解说给
33、一组进程发送信号。signal是发送的数字信号,9为杀掉进程。proclist是进程ID列表。详见kill的UNIX帮助。例子结果输出3、进程控制函数函数名sleep调用语法sleep (time);解说将程序暂停一段时间。time是停止的秒数。返回值为实际停止的秒数。例子sleep (5);结果输出无函数名wait调用语法procid = wait();解说暂停程序执行,等待子进程终止。不需要参数,返回值为子进程ID,如果没有子进程,返回-1。例子结果输出函数名waitpid调用语法waitpid (procid, waitflag);解说暂停程序执行,等待特定的子进程终止。procid为等
34、待的进程ID例子$procid = fork();if ($procid = 0) # this is the child process print (this line is printed firstn); exit(0); else # this is the parent process waitpid ($procid, 0); print (this line is printed lastn);结果输出$ programthis line is printed firstthis line is printed last$4、其它控制函数函数名caller调用语法subinfo
35、 = caller();解说返回调用者的程序名和行号,用于Perl Debugger。返回值为三元素的列表:1、调用处的包名2、调用者文件名3、调用处的行号例子结果输出函数名chroot调用语法chroot (dir);解说改变程序的根目录,详见chroot帮助。例子结果输出函数名local调用语法local($variable);解说在语句块(由大括号包围的语句集合)中定义局域变量,仅在此语句块中起作用,对其的改变不对块外同名变量造成影响。千万不要在循环中使用,否则每次循环都定义一个新的局域变量!例子结果输出函数名times调用语法timelist = times解说返回该程序及所有子进程消
36、耗的工作时间。返回值为四个浮点数的列表:1、程序耗用的用户时间2、程序耗用的系统时间3、子进程耗用的用户时间4、子进程耗用的系统时间例子结果输出二、数学函数函数名sin调用语法retval = sin (value);解说参数为弧度值。函数名cos调用语法retval = cos (value);解说参数为弧度值。函数名atan2调用语法retval = atan2 (value1, value2);解说运算并返回value1除以value2结果的arctan值,单位为弧度,范围在-PIPI。应用例:角度转化成弧度子程序。sub degrees_to_radians local ($degre
37、es) = _; local ($radians);11: $radians = atan2(1,1) * $degrees / 45;函数名sqrt调用语法retval = sqrt (value);解说平方根函数。value为非负数。函数名exp调用语法retval = exp (value);解说返回e的value次方。函数名log调用语法retval = log (value);解说以e为底的自然对数。函数名abs调用语法retval = abs (value);解说绝对值函数。(Perl 4中没有)函数名rand调用语法retval = rand (num);解说随机数函数,返回0和
38、整数num之间的一个浮点数。函数名srand调用语法srand (value);解说初始化随机数生成器。保证每次调用rand真正随机。三、字符串处理函数函数名index调用语法position = index (string, substring, position);解说返回子串substring在字符串string中的位置,如果不存在则返回-1。参数position是可选项,表示匹配之前跳过的字符数,或者说从该位置开始匹配。函数名rindex调用语法position = rindex (string, substring, position);解说与index类似,区别是从右端匹配。函数名
39、length调用语法num = length (string);解说返回字符串长度,或者说含有字符的数目。函数名pos调用语法offset = pos(string);解说返回最后一次模式匹配的位置。函数名substr调用语法substr (expr, skipchars, length)解说抽取字符串(或表达式生成的字符串)expr中的子串,跳过skipchars个字符,或者说从位置skipchars开始抽取子串(第一个字符位置为0),子串长度为length,此参数可忽略,意味着取剩下的全部字符。当此函数出现在等式左边时,expr必须为变量或数组元素,此时其中部分子串被等式右边的值替换。函数
40、名study调用语法study (scalar);解说用一种内部格式提高变量的访问速度,同一时刻只对一个变量起作用。函数名lcuc调用语法retval = lc(string);retval = uc(string);解说将字符串全部转换成小/大写字母。函数名lcfirstucfirst调用语法retval = lcfirst(string);retval = ucfirst(string);解说将第一个字母转换成小/大写。函数名quotameta调用语法newstring = quotemeta(oldstring);解说将非单词的字母前面加上反斜线()。语句 : $string = quo
41、temeta($string);等效于:$string = s/(W)/$1/g;常用于模式匹配操作中,确保字符串中没有字符被看作匹配操作符。函数名join调用语法join (joinstr, list);解说把字符串列表(数组)组合成一个长的字符串,在每两个列表元素间插入串joinstr。函数名sprintf调用语法sprintf (string, fields);解说与printf类似,区别是结果不输出到文件,而作为返回值赋给变量。例子$num = 26;$outstr = sprintf(%d = %x hexadecimal or %o octaln,$num, $num, $num)
42、;print ($outstr);结果输出26 = 1a hexadecimal or 32 octal四、标量转换函数函数名chop调用语法$lastchar = chop (var);解说var可为变量或数组,当var为变量时,最后一个字符被删除并赋给$lastchar,当var为数组/列表时,所有元素的最后一个字符被删除,最后一个元素的最后一个字母赋给$lastchar。函数名chomp调用语法result = chomp(var);解说检查字符串或字符串列表中元素的最后一个字符是否为由系统变量$/定义的行分隔符,如果是就删除。返回值为实际删除的字符个数。函数名crypt调用语法resu
43、lt = crypt (original, salt);解说用DES算法加密字符串,original是将要加密的字符串,salt是两个字符的字符串,定义如何改变DES算法,以使更难解码。返回值为加密后的串。函数名hex调用语法decnum = hex (hexnum);解说将十六进制数(字符串形式)转化为十进制数。函数名int调用语法intnum = int (floatnum);解说将浮点数舍去小数部分转化为整型数。函数名oct调用语法decnum = oct (octnum);解说将八进制数(字符串形式)或十六进制数(0 x.形式)转化为十进制数。函数名ord调用语法asciival =
44、ord (char);解说返回单个字符的ASCII值,与PASCAL中同名函数类似。函数名chr调用语法$char = chr (asciival);解说返回ASCII值的相应字符,与PASCAL中同名函数类似。函数名pack调用语法formatstr = pack(packformat, list);解说把一个列表或数组以在实际机器存贮格式或C等编程语言使用的格式转化(包装)到一个简单变量中。参数packformat包含一个或多个格式字符,列表中每个元素对应一个,各格式字符间可用空格或tab隔开,因为pack忽略空格。除了格式a、A和外,重复使用一种格式多次可在其后加个整数,如: $twoi
45、nts = pack (i2, 103, 241);把同一格式应用于所有的元素则加个*号,如: $manyints = pack (i*, 14, 26, 11, 83);对于a和A而言,其后的整数表示要创建的字符串长度,重复方法如下: $strings = pack (a6 x 2, test1, test2);格式的情况比较特殊,其后必须加个整数,该数表示字符串必须的长度,如果长度不够,则用空字符(null)补足,如: $output = pack (a 6 a, test, test2);pack函数最常见的用途是创建可与C程序交互的数据,例如C语言中字符串均以空字符(null)结尾,创
46、建这样的数据可以这样做: $Cstring = pack (ax, $mystring);下表是一些格式字符与C中数据类型的等价关系:字符 等价C数据类型CcharddoubleffloatiintIunsigned int (or unsigned)llongLunsigned longsshortSunsigned short完整的格式字符见下表。 格式字符 描述a用空字符(null)补足的字符串A用空格补足的字符串b位串,低位在前B位串,高位在前c带符号字符(通常-128127)C无符号字符(通常8位)d双精度浮点数f单精度浮点数h十六进制数串,低位在前H十六进制数串,高位在前i带符号整
47、数I无符号整数l带符号长整数L无符号长整数n网络序短整数N网络序长整数p字符串指针s带符号短整数S无符号短整数u转化成uuencode格式vVAX序短整数VVAX序长整数x一个空字节X回退一个字节以空字节(null)填充函数名unpack调用语法list = unpack (packformat, formatstr);解说unpack与pack功能相反,将以机器格式存贮的值转化成Perl中值的列表。其格式字符与pack基本相同(即上表),不同的有:A格式将机器格式字符串转化为Perl字符串并去掉尾部所有空格或空字符;x为跳过一个字节;为跳过一些字节到指定的位置,如4为跳过4个字节。下面看一个
48、和X合同的例子: $longrightint = unpack (* X4 L, $packstring);此语句将最后四个字节看作无符号长整数进行转化。下面看一个对uuencode文件解码的例子:1 : #!/usr/local/bin/perl2 : 3 : open (CODEDFILE, /u/janedoe/codefile) |4 : die (Cant open input file);5 : open (OUTFILE, outfile) |6 : die (Cant open output file);7 : while ($line = ) 8 : $decoded = u
49、npack(u, $line);9 : print OUTFILE ($decoded);10: 11: close (OUTFILE);12: close (CODEDFILE); 当将pack和unpack用于uuencode时,要记住,虽然它们与UNIX中的uuencode、uudecode工具算法相同,但并不提供首行和末行,如果想用uudecode对由pack的输出创建的文件进行解码,必须也把首行和末行输出(详见UNIX中uuencode帮助)。函数名vec调用语法retval = vec (vector, index, bits);解说顾名思义,vec即矢量(vector)函数,它把
50、简单变量vector的值看作多块(维)数据,每块含一定数目的位,合起来即一个矢量数据。每次的调用访问其中一块数据,可以读取,也可以写入。参数index就象数组下标一样,提出访问哪一块,0为第一块,依次类推,要注意的是访问次序是从右到左的,即第一块在最右边。参数bits指定每块中的位数,可以为1,2,4,8,16或32。例子1 : #!/usr/local/bin/perl2 : 3 : $vector = pack (B*, 11010011);4 : $val1 = vec ($vector, 0, 4);5 : $val2 = vec ($vector, 1, 4);6 : print (
51、high-to-low order values: $val1 and $val2n);7 : $vector = pack (b*, 11010011);8 : $val1 = vec ($vector, 0, 4);9 : $val2 = vec ($vector, 1, 4);10: print (low-to-high order values: $val1 and $val2n); 结果high-to-low order values: 3 and 13low-to-high order values: 11 and 12函数名defined调用语法retval = defined
52、(expr);解说判断一个变量、数组或数组的一个元素是否已经被赋值。expr为变量名、数组名或一个数组元素。如果已定义,返回真,否则返回假。函数名undef调用语法retval = undef (expr);解说取消变量、数组或数组元素甚至子程序的定义,回收其空间。返回值始终为未定义值,此值与空串等效。五、数组和列表函数函数名grep调用语法foundlist = grep (pattern, searchlist);解说与同名的UNIX查找工具类似,grep函数在列表中抽取与指定模式匹配的元素,参数pattern为欲查找的模式,返回值是匹配元素的列表。例子list = (This, is,
53、a, test);foundlist = grep(/tT/, list);结果foundlist = (This, test);函数名splice调用语法retval = splice (array, slipelements, length, newlist);解说拼接函数可以向列表(数组)中间插入元素、删除子列表或替换子列表。参数skipelements是拼接前跳过的元素数目,length是被替换的元素数,newlist是将要拼接进来的列表。当newlist的长度大于length时,后面的元素自动后移,反之则向前缩进。因此,当length=0时,就相当于向列表中插入元素,而形如语句splice (array, -1, 0, Hello);则向数组末尾添加元素。而当newl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-河北-河北地图绘制员一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-江西-江西计量检定工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-江西-江西机械冷加工四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-江西-江西中式烹调师五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-江苏-江苏管道工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-江苏-江苏保健按摩师四级(中级工)历年参考题库含答案详解
- 2026事业单位工勤技能-新疆-新疆水生产处理工二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-新疆-新疆园林绿化工二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-广西-广西计量检定工五级(初级工)历年参考题库含答案详解
- 2026事业单位工勤技能-广西-广西政务服务办事员四级(中级工)历年参考题库含答案详解
- 1.1走进互联网世界课件-七年级上册《信息技术》西大版
- 脊柱侧弯课件
- 生命早期一千天课件
- 物流营销与客户关系 课件 单元五 物流客户开发
- XX县XX镇XX中学改造扩建工程项目可行性研究报告
- 大连恒力石化管理制度
- JG/T 169-2016建筑隔墙用轻质条板通用技术要求
- 低压电气箱内置自动消防技术规范
- 《陶瓷釉下彩绘技艺》课件
- 安全生产法律法规注册安全工程师考试(初级)试卷及解答参考(2025年)
- DB33T 1141-2017 保温装饰夹心板外墙外保温系统应用技术规程
评论
0/150
提交评论