Perl语言入门实战习题
Perl语言入门(第四版)习题答案

Perl语言入门(第四版)习题答案《Perl语言入门习题答案》2.12 练习1、写一个程序,计算半径为12.5的圆的周长。
圆周长等于2π(π约为3.1415926)乘以半径。
答案为78.5。
-----------------------/home/confish/perl/girth#!/usr/bin/perl -w#this program calculate a circle's girth#confish@ubuntu7.10$r=12.5;$g=12.5*2*3.1415;print "the girth of the circle is $g\n";-----------------------/home/confish/perl/girth2、修改上述程序,用户可以在程序运行时输入半径。
如果,用户输入12.5,则应得到和上题一样的结果。
-----------------------/home/confish/perl/girthpro #!/usr/bin/perl -w#a better one to calculate girth#confish@ubuntu7.10print"enter the radius of the circle\n";chomp($r=<STDIN>);if($r>0){print"the girth of the circle is".$r*2*3.1415."\n";}else{print"nonavailable!\n";}-----------------------/home/confish/perl/girthpro3、修改上述程序,当用户输入小于0 的数字时,程序输出的周长为0,而非负数。
-----------------------/home/confish/perl/girthzero #!/usr/bin/perl -w#calculate the girth and print 0 when the radius is lower than 0#confish@ubuntu7.10print"enter the radius of the line\n";chomp($r=<STDIN>);if($r>0){print"the girth of the circle is$r*2*3.1415\n";}else{print"the girth of the circle is 0\n";}-----------------------/home/confish/perl/girthzero1、2、3:(一起实现的)#!/usr/bin/perl -w$pai=3.141592654;print "Please Input Radius:";$r=<STDIN>;if ( $r lt 0 ){print "The circumference is 0\n";}else{$l=$r*2*$pai;printf "The circumference is %.1f\n",$l;}4、写一个程序,用户能输入2 个数字(不在同一行)。
Perl编程题-题目(1)

1.输出文件行数。
2.输出FASTA、FASTQ序列文件包含的序列条数。
3.将文件从最后一行一直输出到第一行。
4.FASTA序列反向互补。
5.FASTQ序列转FASTA序列。
6.输入文件:
输出要求:为文件中第一列(基因ID)添加描述信息。
6.根据基因ID将不同文件中该基因的某一统计信息整合输出到一个文件中。
输入文件:
11.将一个文件,按照任意给定的数字(行数),等分成几分,注意最后一份可能数据不足给出的行数。比如:一个文件10行,输入3,给出4个文件:1-3,4-6,7-9,10
输入文件:
12.求一个序列的GC含量,和N的比率。
输入文件:
输入文件:
输出要求:将两个文件中都有的基因输 Nhomakorabea,并输出其在不同文件中的log2值。
7.给出一个read,求其平均质量值。
输入文件:
8.给出两组序列,找出其中的公共序列(按名称处理)。perl
输入文件:
9.给出一条fa序列,提取其中的10-150这部分位点的序列出来(起始位点为1)。
输入文件:
10.统计fa格式的序列长度。
perl面试例题

Perl 第一阶段学习总结1 use strict 和use warnings 的作用?use strict 什么场合要用use strict?当你的程序有一定的行数时,尤其是在一页放不下时,或者是你找不到发生错误的原因时。
为什么要用 use strict?众多的原因之一是帮你寻找因为错误拼写造成的错误。
比如错误使用了'$recieve_date' 变量,但实际上你在程序中已声明的是 '$receive_date' 变量,这个错误就很难发现。
同样,use strict 迫使你把变量的范围缩到最小,使你不必担心同名变量在程序的其它部份发生不良作用。
(尽管这是 my 的功能,但是如果你使用 use strict 的话,它会强迫你用 my 声明变量,来达到上述目的)。
指定了use warnings;的话perl在编译的时候会将警告信息打印出来,否则不打印。
2 perl注释的方法?(1)‘#’用于注释单行(2) 注释一段=cut; #注释=cut 包围的代码………=cut;Or<<TXT; #注释<<TXT…TXT包围的代码………TXTOr__END__ #注释此行之后的所有代码………Or__DATA__ #可将__DATA__之后的代码作为程序的参数列表………3 单引号和双引号的区别?单引号不能内插且只能转义’\’,’’’两个字符。
双引号可以内插和转义所有字符。
4 print @array;print “@array”;print @array . “\n”有什么区别?Eg:my @array = qw/a b c/;Print @array; # abcPrint “@array” # a b c “内插时,会在数组各个元素之间自# 动添加分隔用的空格(小骆驼书原话)”Print @array . “\n” # 3 ‘.’是标量操作符,所以@array是#标量上下文。
PML基础练习

PML基础练习⼀个简单的 Macro (1)参数化宏Parameterized Macro (2)变量给属性赋值 (2)字符串⽅法实例 (2)定义函数 (2)练习-新建函数计算园的⾯积,测试函数 (3)条件判断语句(If Construct) (3)练习-条件判断 (3)循环赋值 (4)中断循环 Break (4)⽤skip 跳过奇数 (4)练习-跳转 (5)错误提⽰ (5)错误处理(Error Handling) (5)数组(Array) (6)赋值循环Do value (6)索引循环Do indices (6)管道排序 (6)练习-选择⼀个设备,将所有Nozzle连接的管道添加进来 (6)显⽰输出窗⼝.................................................................................错误!未定义书签。
⼀个简单的对话框(Form) (7)缺省构造⽅法(Constructor method) (7)控件定位 (7)控件定义 (8)设置控件初始值 (8)按钮的应⽤实例 (9)对话框控制属性-Apply (9)多选框的应⽤实例 (10)列表框应⽤实例 (11)Alpha Views (12)V olumn View (13)⽂件处理(Handling Files) (13)练习-⽂件处理 (13)选择⽂件 (13)⼀个简单的 MacroNEW EQUIP /FREDNEW BOXXLEN 300 YLEN 400 ZLEN 600NEW CYL DIA 400 HEI 600CONN P1 TO P2 OF PREV参数化宏Parameterized MacroNEW EQUIP /$1NEW BOXXLEN $2 YLEN $3 ZLEN $4NEW CYL DIA $3 HEI $4CONN P1 TO P2 OF PREV变量给属性赋值New PipeDesc 'My Description'Temp 100Pspec /A3BPurp PIPI!desc = desc!temp = temp!pspec = pspec!purp = purpNew PipeDesc '$!desc'Temp $!temppspec $!pspecpurp $!purp字符串⽅法实例!str = 'hello how are you!'!newstr = !str.after('hello').trim().replace('how', 'where').replace('!', '?') q var !newstr定义函数define function !!Area( !Length is REAL, !Width is REAL ) is REAL !Area = !Length * !Widthreturn !Area $*函数!!Area有两个参数⼀个返回值Endfunction练习-新建函数计算圆的⾯积,测试函数define function !!circleArea( !radius is REAL) is REAL !Area = PI * !Radius.Power(2) return !AreaEndfunction条件判断语句(If Construct)!Type = Type!OwnType = Type of OwnerIF (!Type eq 'BRAN') THEN$P CE is Branch.ELSEIF (!OwnType eq 'BRAN') THEN$P CE is Branch member.ELSE$P CE is $!Type,Pls select Branch.ENDIF练习-条件判断!type = typeadd ceif(!type eq 'BRAN') thenadd hrefadd trefelseif(!type eq 'NOZZ') thenadd crefendif$p Current type = $!type进⼀步判断:打印加⼊的元素个数!n = 0!type = typeadd ceif(!type eq 'BRAN') then!href = href!tref = trefif(!href.set()) then!n = !n + 1add hrefendifif(!tref.set()) then!n = !n + 1add trefendifelseif(!type eq 'NOZZ') then!cref = crefif(!cref.set()) then!n = !n + 1add crefendifendif$p Current type = $!type$p Total $!n reference循环赋值!Total = 0Do !x From 1 To 100 By 1!Total = !Total + !xEnddo中断循环 Break!Total = 0Do !x From 1 To 100!Total = !Total + !xIf(!Total gt 500) thenBreak $*或者Break if(!Total gt 500)EndifEnddo⽤skip 跳过奇数Do !x From 1 To 100If(Int(!x / 2) NE (!x / 2)) thenSkip $*或者Skip If(Int(!x / 2) NE (!x / 2)) Endif !Total = !Total + !xEnddo练习-跳转!n = 0label /start!type = typeif(!type eq 'BRAN') then !href = href!tref = trefif(!href.set()) then!n = !n + 1add hrefendifif(!tref.set()) then!n = !n + 1add trefendifendifif(!type eq 'NOZZ') then !cref = crefif(!cref.set()) then!n = !n + 1add crefgoto crefgolabel /startendifendif$p Total $!n reference错误提⽰Next$p OK错误处理(Error Handling) NextHandle any EndHandle$p OK数组(Array)!Str = 'Benz,Bmw,Audi' !BestCar = !Str.Split(',') Q var ! BestCar!BestCar[5] = 'Cadillac'!BestCar.Append('Lincoln')赋值循环Do valuedo !Name values !BestCar$p Array element is $!NameEnddo索引循环Do indicesdo !n indices !BestCar!Car = !BestCar[!n]$p Array element $!n is $!CarEnddo管道排序Var !Pipes Coll all Pipe for ce!pipename = array()Do !pipe value !pipes$!pipe!name = name!pipename.append(!name)EnddoVar !Names Eval name for all from !Pipes!Names.sort().invert()Do !n indices !Namesreorder $!names[$!n] before $!nEndDo练习-选择⼀个设备,将所有Nozzle连接的管道添加进来Add ceAuto ceVar !nozzles Coll all nozzle for ceVar !Crefs eval cref for all from !nozzlesDo !Cref value !CrefsAdd $!crefEndDo⼀个简单的对话框(Form)setup form !!helloTitle 'Hello'Paragraph .Message text 'Hello world'button .bye 'Goodbye' OKexit缺省构造⽅法(Constructor method)setup form !!helloTitle 'Hello'paragraph .Message text 'Hello world'text .input 'Enter text' width 10 is string $*字符串类型的编辑框button .bye 'Goodbye' OKexitDefine method .hello() $*缺省构造⽅法,与Form同名,不带参数!this.input.callback = ‘!this.doinput()’ $*Callback指明响应操作endmethodDefine method .doinput() $*响应操作!this.message.val = !this.input.val $*!this = !!hello, val 表⽰value endmethod 控件定位setup form !!helloTitle 'Hello'paragraph .Message text 'Hello world'text .input 'Enter text' at x0 ymax width 10 is stringbutton .bye 'Goodbye' at x0 ymax OKexit控件定义setup form !!addvolumntitle 'Add volumn'button .ce 'CE' at x0 ymax tooltip 'Select pipe'paragraph .cename text 'no name' width 15text .input 'Enter text' at x0 ymax width 10 is stringFrame .frame1 'Include' at x0 ymaxtoggle .bran 'Branch'toggle .equi 'Equipment'Exitlist .list 'Drawlist' at x0 ymax+0.3 width 18 height 5button .ok 'OK' at x0 ymax OKpath rightbutton .apply 'Apply' applybutton .cancel 'Cancel' Cancel!modifyOnIcon = !!pml.getpathname('modmodeon16.png') button .pick pixmap /$!modifyonicon at x0 ymax exit设置控件初始值setup form !!addvolumntitle 'Add volumn'button .ce 'CE' at x0 ymax tooltip 'Select pipe'paragraph .cename text 'no name' width 15text .input 'Enter text' at x0 ymax width 10 is stringFrame .frame1 'Include' at x0 ymaxtoggle .bran 'Branch'toggle .equi 'Equipment'Exitlist .list 'Drawlist' at x0 ymax+0.3 width 18 height 5button .ok 'OK' at x0 ymax OKpath rightbutton .apply 'Apply' applybutton .cancel 'Cancel' Cancel!modifyOnIcon = !!pml.getpathname('modmodeon16.png') button .pick pixmap /$!modifyonicon at x0 ymax exitdefine method .addvolumn()!this.bran.val = true!this.input.val = '1500'endmethod按钮的应⽤实例setup form !!addvolumntitle 'Add volumn'button .ce 'CE' at x0 ymax tooltip 'Select pipe'paragraph .cename text 'no name' width 15text .input 'Enter text' at x0 ymax width 10 is stringFrame .frame1 'Include' at x0 ymaxtoggle .bran 'Branch'toggle .equi 'Equipment'Exitlist .list 'Drawlist' at x0 ymax+0.3 width 18 height 5button .ok 'OK' at x0 ymax OKpath rightbutton .apply 'Apply' applybutton .cancel 'Cancel' Cancel!modifyOnIcon = !!pml.getpathname('modmodeon16.png') button .pick pixmap /$!modifyonicon at x0 ymax exitdefine method .addvolumn()!this.bran.val = true!this.input.val = '1500'!this.ce.callback = '!this.ce()'endmethoddefine method .ce()!this.cename.val = fullnameendmethod对话框控制属性-Applysetup form !!addvolumntitle 'Add volumn'button .ce 'CE' at x0 ymax tooltip 'Select pipe'paragraph .cename text 'no name' width 15text .input 'Enter text' at x0 ymax width 10 is stringFrame .frame1 'Include' at x0 ymaxtoggle .bran 'Branch'toggle .equi 'Equipment'Exitlist .list 'Drawlist' at x0 ymax+0.3 width 18 height 5button .ok 'OK' at x0 ymax OKpath rightbutton .apply 'Apply' applybutton .cancel 'Cancel' Cancel!modifyOnIcon = !!pml.getpathname('modmodeon16.png') button .pick pixmap /$!modifyonicon at x0 ymax exitdefine method .addvolumn()!this.bran.val = true!this.input.val = '1500'!this.ce.callback = '!this.ce()'!this.apply.callback = '!this.apply()' $*不关闭对话框endmethoddefine method .ce()!this.cename.val = fullnameendmethoddefine method .apply()!dist = !this.input.val!name = !this.cename.val$p CE is $!name ,Dist = $!distendmethod多选框的应⽤实例setup form !!addvolumntitle 'Add volumn'button .ce 'CE' at x0 ymax tooltip 'Select pipe'paragraph .cename text 'no name' width 15text .input 'Enter text' at x0 ymax width 10 is stringFrame .frame1 'Include' at x0 ymaxtoggle .bran 'Branch'toggle .equi 'Equipment'Exitlist .list 'Drawlist' at x0 ymax+0.3 width 18 height 5button .ok 'OK' at x0 ymax OKpath rightbutton .apply 'Apply' applybutton .cancel 'Cancel' Cancel!modifyOnIcon = !!pml.getpathname('modmodeon16.png') button .pick pixmap /$!modifyonicon at x0 ymax exitdefine method .addvolumn()!this.bran.val = true!this.input.val = '1500'!this.ce.callback = '!this.ce()'!this.apply.callback = '!this.apply()' $*不关闭对话框endmethoddefine method .ce()!this.cename.val = fullnameendmethoddefine method .apply()!name = !this.cename.val!dist = !this.input.val!elements = array()if(!this.bran.val) thenvar !elements append coll all bran Within Volume $!name $!dist endifif(!this.equi.val) thenvar !elements append coll all equip Within Volume $!name $!dist endifvar !names eval name for all from !elementsdo !element value !elementsadd $!elementenddoendmethod列表框应⽤实例setup form !!addvolumntitle 'Add volumn'button .ce 'CE' at x0 ymax tooltip 'Select pipe'paragraph .cename text 'no name' width 15text .input 'Enter text' at x0 ymax width 10 is stringFrame .frame1 'Include' at x0 ymaxtoggle .bran 'Branch'toggle .equi 'Equipment'Exitlist .list 'Drawlist' at x0 ymax+0.3 width 18 height 5button .ok 'OK' at x0 ymax OKpath rightbutton .apply 'Apply' applybutton .cancel 'Cancel' Cancel!modifyOnIcon = !!pml.getpathname('modmodeon16.png') button .pick pixmap /$!modifyonicon at x0 ymax exitdefine method .addvolumn()!this.bran.val = true!this.input.val = '1500'!this.ce.callback = '!this.ce()'!this.apply.callback = '!this.apply()' $*不关闭对话框!this.list.callback = '!this.doselection()'endmethoddefine method .ce()!this.cename.val = fullnameendmethoddefine method .apply()!name = !this.cename.val!dist = !this.input.val!elements = array()if(!this.bran.val) thenvar !elements append coll all bran Within Volume $!name $!dist endif if(!this.equi.val) thenvar !elements append coll all equip Within Volume $!name $!dist endif var !names eval name for all from !elements!this.list.dtext = !namesdo !element value !elementsadd $!elementenddoendmethoddefine method .doselection()!name = !this.list.selection()$!nameendmethodAlpha ViewsSetup Form !!alphaviewtitle ' Input & Output'view .Input ALPHA hei 10 width 40channel REQUESTSchannel COMMANDSExitbutton .apply 'Apply' at x0 ymax Applybutton .Dismiss 'Cancel' at Xmax form-size CancelExitVolumn Viewsetup form !!poptestview .vol volume width 50 hei 9exitpath downbutton .press 'swap popup' call '!this.popswap()'menu .popmenuadd 'hello' ' 'add 'world' ' 'exitexitdefine method .popswap()!this.vol.popup = !this.popmenuendmethod⽂件处理(Handling Files)!Input = object FILE('%pdmsexe%abc.txt')!Lines = !Input.ReadFile() $* ReadFile将⽂件内容写到字符串数组中!ResultArray = ARRAY() $* 声明新数组do !Line VALUES !Lines!Column1 = !Line.Part(1)!ResultArray.Append( !Column1)Enddo!Output = object FILE('%pdmsexe%def.txt')!Output.WriteFile('WRITE', !ResultArray) $* WriteFile将数组写到⽂件练习-⽂件处理!Input = object FILE('%pdmsexe%abc.txt')!Lines = !Input.ReadFile()do !Line VALUES !Lines$p $!lineEnddo选择⽂件setup form !!findfiletitle 'Find file'text .filename 'File name' at x1 ymax+0.3 width 35 is stringbutton .browser 'Brower'button .ok ' OK ' at x1 ymax+0.3 OKbutton .cancel 'Cancel' at x10 cancelexitdefine method .findfile()!this.browser.callback = |!!filebrowser('%pdmsuser%','*','',true,'!!findfile.filename.val = !!()')|endmethodSYSCOM 'notepad.exe &'后⾯加个&时单独启⽤进程调⽤应⽤程序,PDMS就不会处于停滞模态。
pink练习题

pink练习题一、基础知识类1. 请列举出五种常见的编程语言及其主要用途。
2. 简述面向对象编程中的三大特性。
3. 请解释什么是数据结构,并列举出三种常见的数据结构。
4. 描述操作系统的五大功能。
5. 请说明计算机网络中的OSI七层模型。
6. 简述数据库的基本概念,包括数据库、数据库管理系统和SQL语言。
7. 请解释什么是算法,并列举出三种常见的排序算法。
8. 描述软件工程的五大过程模型。
9. 请说明计算机硬件系统的主要组成部分。
10. 简述计算机软件的分类。
二、编程实践类1. 编写一个Python程序,实现输入一个整数,输出它的阶乘。
2. 编写一个C++程序,实现输入一个字符串,输出它的反转形式。
3. 编写一个Java程序,实现一个简单的计算器功能,包括加、减、乘、除。
4. 编写一个JavaScript程序,实现一个简单的网页时钟。
5. 编写一个HTML和CSS代码,实现一个简单的网页布局。
6. 编写一个SQL查询语句,查询学生表中年龄大于18岁的学生信息。
7. 编写一个PHP程序,实现用户登录功能。
8. 编写一个React组件,实现一个待办事项列表。
9. 编写一个Node.js程序,实现一个简单的HTTP服务器。
10. 编写一个TypeScript程序,实现一个简单的类和对象。
三、算法与数据结构类1. 请用伪代码描述冒泡排序算法的实现过程。
2. 请用Python实现快速排序算法。
3. 请用C++实现链表的基本操作,包括插入、删除和查找。
4. 请用Java实现二叉树的前序遍历、中序遍历和后序遍历。
5. 请用JavaScript实现堆排序算法。
6. 请用PHP实现图的邻接矩阵表示和深度优先搜索。
7. 请用C实现哈希表的基本操作,包括插入、删除和查找。
8. 请用Go实现红黑树的插入操作。
9. 请用Rust实现跳表的数据结构。
10. 请用Swift实现并查集的数据结构。
四、操作系统与计算机网络类1. 请解释进程和线程的区别。
P、V原语操作的几道习题

begin repeat
P(sb);
P(mutex); 将B产品入库; V(mutex); V(sa);
until false
end
until false
end
习题六
今有三个并发进程R,M,P,它们共享了一个 可循环使用的缓冲区B,缓冲区B共有N个单元。 进程R负责从输入设备读信息,每读一个字符后, 把它存放在缓冲区B的一个单元中;进程M负责 处理读入的字符,若发现读入的字符中有空格符 ,则把它改成“,”;进程P负责把处理后的字符 取出并打印输出。当缓冲区单元中的字符被进程 P取出后,则又可用来存放下一次读入的字符。 请用PV操作为同步机制写出它们能正确并发执 行的程序。 0 1 2 3 4 5 6 … … N-1
mf[0:N] = 0;
表示每个缓冲区是否为满的标志: ff[0:N ]=0;
表示每个缓冲区中的数据:B[0:N ]
PP: PR: PM: Begin Begin Begin P(full) 读一个字符ch; P(SM); P(mutex) P(mutex); P(avail) 找到一个 buffer j,它 找到一个buffer k ,它 P(mutex) (ff[k] true & 取出一个空的缓 (ff[j] true & mf[k] true;) 冲区i; mf[j] false;) Print B[k]; ff[i] true Modifiy B[j]; ff[k] false B[i]ch; mf[j] true mf[k] false; mf[i] false; V(mutex) V(mutex) V(mutex); V(full); V(avail); V(SM); End; End; End;
Perl练习题

2.12 练习写一个程序,计算半径为12.5的圆的周长。
圆周长等于2π(π约为3.1415926)乘以半径。
答案为78.5。
#!/usr/bin/perl$r=12.5;$pai=3.1415926 ;$C=2*$pai*$r;Print “$C\n”;修改上述程序,用户可以在程序运行时输入半径。
如果,用户输入12.5,则应得到和上题一样的结果。
#!/usr/bin/perl$r=<STDIN>;$pai=3.1415926 ;$C=2*$pai*$r;Print “$C\n”;修改上述程序,当用户输入小于0 的数字时,程序输出的周长为0,而非负数。
#!/usr/bin/perl$r=<STDIN>;$pai=3.1415926 ;if($r>=0){$C=2*$pai*$r;}If($r<0){$C=0;}Print “$C\n”;写一个程序,用户能输入2 个数字(不在同一行)。
输出为这两个数的积。
#!/usr/bim/perl$a=<STDIN>;$b=<STDIN>;$c=$a*$b;Print”$c”;写一个程序,用户能输入1 个字符串和一个数字(n)(不在同一行)。
输出为,n 行这个字符串,1 次1 行(提示,使用“x”操作符)。
例如,如果用户输入的是“fred”和“3”,则输出为:3 行,每一行均为fred。
如果输入为“fred”和“299792”,则输出为299792 行,每一行均为fred。
#!/usr.bin/perl$string=<STDIN>;$int=<STDIN>;$output=$string x $intprint $output;3.9练习写一个程序,将一些字符串(不同的行)读入一个列表中,逆向输出它。
如果是从键盘输入的,那在Unix 系统中应当使用CTRL+D 表明end-of-file,在Windows 系统中使用CTRL+Z.写一个程序,读入一串数字(一个数字一行),将和这些数字对应的人名(下面列出的)输出来。
perl 正则表达式例题

perl 正则表达式例题当然可以!以下是一些使用 Perl 正则表达式的例题:1. 匹配数字:```perl$string = "我有100个苹果和20个香蕉";if ($string =~ /(\d+)/) {print "匹配到的数字是: $1\n";}```输出:```匹配到的数字是: 100```2. 匹配邮箱地址:```perl$email = "";if ($email =~ /([a-zA-Z0-9_-]+[a-zA-Z0-9_-]+\.[a-zA-Z]{2,})/) { print "匹配到的邮箱地址是: $1\n";}```输出:```匹配到的邮箱地址是:```3. 匹配日期格式:YYYY-MM-DD```perl$date = "今天是";if ($date =~ /(\d{4})-(\d{2})-(\d{2})/) {print "匹配到的年份是: $1, 月份是: $2, 日期是: $3\n";}输出:```yaml匹配到的年份是: 2023, 月份是: 07, 日期是: 19```4. 替换字符串中的内容:```perl$text = "我喜欢吃苹果和香蕉";$new_text = $text =~ s/苹果/桃子/;print $new_text; 输出: 我喜欢吃桃子和香蕉```这些例题可以帮助你理解 Perl 正则表达式的使用方法和功能。
当然,Perl 正则表达式还有更多高级的用法和技巧,你可以查阅相关资料或参考 Perl 的官方文档来深入学习。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《Perl语言入门实战习题》一、计算FASTA文件中每条序列的长度;输入文件,FASTA格式:注:如果输入文件在windows下产生,在Linux系统下操作时,宜先用dos2unix处理:用法:dos2unix 输入文件输出文件:Perl代码:#!/usr/bin/perl -wuse strict;unless (@ARGV==2) { # @ARGV 传给脚本的命令行参数列表die"Usage: perl $0 <input.fa> <out.len>\n"; # 当命令行参数不是2的时候输出使用说明}my ($infile,$outfile) = @ARGV; # 把命令行参数赋值给输入文件和输出文件open IN,$infile || die"error: can't open infile: $infile"; # 打开输入文件句柄INopen OUT,">$outfile" || die$!; # 打开输出文件句柄OUT$/=">";<IN>; # 设置输入记录分隔符为”>”,并去除第一个”>”while ( my $seq = <IN>){ # 把序列ID行和序列赋值给$seqmy $id = $1 if($seq =~ /^(\S+)/); # 获取序列IDchomp $seq; # 去掉末尾的”>”$seq =~ s/^.+?\n//; # 删除第一行$seq =~ s/\s//g; # 删除序列中的空白字符my $len = length($seq); # 计算序列长度print OUT "$id\t$len\n"; # 输出结果到输出文件}$/="\n"; # 把输入记录分隔符改为默认值close IN; # 关闭输入文件句柄close OUT; # 关闭输出文件句柄二、计算FASTA文件中每条序列的GC含量;输入文件同上,输出文件:Perl代码:#!/usr/bin/perl -wuse strict;unless (@ARGV==2) {# @ARGV 传给脚本的命令行参数列表die"Usage: perl $0 <input.fa> <out.gc>\n";# 当命令行参数不是2的时候输出使用说明}my ($infile,$outfile) = @ARGV;# 把命令行参数赋值给输入文件和输出文件open IN,$infile || die"error: can't open infile: $infile";# 打开输入文件句柄INopen OUT,">$outfile" || die$!;# 打开输出文件句柄OUT$/=">";<IN>;# 设置输入记录分隔符为”>”,并去除第一个”>”while (<IN>){# $_=<IN>,把序列ID行和序列赋值给$_,$_= 可以省略不写my $id = $1 if(/^(\S+)/);# 获取序列IDchomp; # 去掉末尾的”>”s/^.+?\n//;# 删除第一行s/\s//g; # 删除序列中的空白字符my $GC = (tr/GC/GC/);#计算G或C碱基个数my $AT = (tr/AT/A T/);#计算A或T碱基个数my $len = $GC + $AT;# 计算序列非N长度my $gc_cont = $len ? $GC / $len : 0; #计算GC含量,如果长度为0,GC含量算0 print OUT "$id\t$gc_cont\n"; # 输出结果到输出文件}$/="\n";# 把输入记录分隔符改为默认值close IN; # 关闭输入文件句柄close OUT;# 关闭输出文件句柄三、求反相互补序列;输入文件同上,输出文件也是FASTA格式Perl代码:#!/usr/bin/perl -wuse strict;unless (@ARGV==2) {# @ARGV 传给脚本的命令行参数列表die"Usage: perl $0 <input.fa> <out.gc>\n";# 当命令行参数不是2的时候输出使用说明}my ($infile,$outfile) = @ARGV;# 把命令行参数赋值给输入文件和输出文件open IN,$infile || die"error: can't open infile: $infile";# 打开输入文件句柄INopen OUT,">$outfile" || die$!;# 打开输出文件句柄OUT$/=">";<IN>;# 设置输入记录分隔符为”>”,并去除第一个”>”while (<IN>){# $_=<IN>,把序列ID行和序列赋值给$_,$_= 可以省略不写my $id = $1 if(/^(\S+)/);# 获取序列IDchomp; # 去掉末尾的”>”s/^.+?\n//;# 删除第一行s/\s//g; # 删除序列中的空白字符$_ = reverse $_; # 序列方向tr/ATCG/TAGC/; # 序列互补print OUT ">$id\n",$_,"\n"; # 输出结果到输出文件}$/="\n";# 把输入记录分隔符改为默认值close IN; # 关闭输入文件句柄close OUT;# 关闭输出文件句柄四、列表信息整合;输入列表1:序列长度文件输入文件2:序列测序覆盖深度文件输出文件:把上述两个列表的信息整合成一个列表,并且最后一行给出汇总结果:Perl代码#!/usr/bin/perl -wuse strict;(@ARGV==3) || die"Usage: perl $0 <list1> <list2> <combine.list>\n";# 当命令行参数不是3的时候输出使用说明my ($infile1,$infile2,$outfile) = @ARGV;# 把命令行参数赋值给输入文件1、输入文件2和输出文件my %id_len; # 定义一个哈希open IN1,$infile1 || die$!; # 打开第一个文件句柄while(<IN1>){my ($id,$len) = split /\s+/,$_; # split函数用空白符号切割每一行的内容$id_len{$id} = $len; # 哈希赋值:id => length}close IN1; # 关闭第一个文件句柄open IN2,$infile2 || die$!; # 打开第2个文件句柄open OUT,">$outfile" || die$!; # 打开输出文件句柄my $tol_len = 0; # 定义总长度变量,并赋值为0my $tol_depth = 0; # 定义总深度变量,并赋值为0while (<IN2>){my ($id,$depth) = split; # split函数用空白符号切割每一行的内容my $len = $id_len{$id}; # 序列长度print OUT join("\t",$id,$len,$depth),"\n"; # 输出整合信息到输出文件$tol_len += $len; # 长度累加$tol_depth += $len * $depth; # 深度累加}$tol_depth /= $tol_len; # 计算总体平均深度print OUT "Total\t$tol_len\t$tol_depth\n"; # 输出汇总结果到输出文件close IN2; # 关闭第二个输入文件句柄close OUT; # 关闭输出文件句柄五、串流程;Perl在工作中常用于串流程,现有同事写了3个perl脚本分三步将输入文件,infile.txt处理成最终的final.result:第1步:perl step1.pl infile.txt output1第2步:perl step2.pl infile.txt output2第3步:perl step3.pl output1 output2 final.result为提高工作效率,现需要写一个脚本使用infile.txt 作为输入文件,直接得到final.result,中间产生的文件结果不保留。
#!/usr/bin/perl -wuse strict;unless (@ARGV==2) {# @ARGV 传给脚本的命令行参数列表die"Usage: perl $0 <infile> <out.result>\n";# 当命令行参数不是2的时候输出使用说明}my ($infile,$outfile) = @ARGV;# 把命令行参数赋值给输入文件和输出文件my $temp_file = “temp.$$”; # 临时文件,$$为进程号,这样可以保证文件名字的唯一性system“perl step1.pl $infile $temp.1perl step2.pl $infle $temp.2perl step3.pl $temp.1 $temp.2 $outfilerm $temp.1 $temp.2”#使用system调用3个perl脚本进行处理。