预览加载中,请您耐心等待几秒...
1/7
2/7
3/7
4/7
5/7
6/7
7/7

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Spring,2008 Perl语言高级编程专题 Lesson10 周晓方 courses@xfzhou.homeftp.org 《Perl调试技巧》清华大学出版社2001年 (PeterScott,EdWright,"PerlDebugged")1 ayup! study.Dayd GoodgoodSpring,2008 对Perl程序员的忠告 •区分$,@,%,函数后的括号可以省略 •和C语言的一些区别: –类型的多态性 –没有malloc/free的困扰 –$a||$b不返回布尔值,返回$a或$b之一的值 –?:可以是左值:($flag?$a:$b)=6; –没有struct,union,switch等 –C的i[a]和a[i]等价,perl不是 2 Spring,2008 资源的优化 •首先确保可读性和可维护性(据Moore'slaw) •利用任务管理器查看内存占用情况,用 Benchmark,Devel::DProf确定运行的时间 •及早结束循环:循环体开头合理增加next/last •尽量避免调用外部程序,避免``或system() •节约内存:优先用数组,再hash,最后标量 •空间换速度:Memoize模块,记住已有调用 •速度换空间:大hash用tie函数关联到数据库 3 ayup! study.Dayd GoodgoodSpring,2008 语义(理解上的差别) •语义错误:open(A,'f')|die"Error"; •语义错误:printf"Numberof\@a=%d",@a; •用B::Deparse查看perl对代码的理解 Deparse还很简陋,但遇到了奇怪现象,可以单独拿 出来试一试 perl-MO=Deparse-e"for($i=1;$i<10;$i++){$j+=$i;}" for($i=1;$i<10;++$i){ $j+=$i; } -esyntaxOK perl-MO=Deparse-e"usestrictmy$a=1;print$a;exit;" print$a; exit; -esyntaxOK4 Spring,2008 perl的调试器 •perl-dmyscripts.pl –sStep运行一行,跟踪进入子程序 –nNext运行一行 –rReturn运行到当前子程序结束 –p变量名查看变量 –x变量名查看变量,友好格式(hash用引用) –l/-/w列出前后的代码 –c行号执行到"行号" –c执行,直到遇到断点 –b行号设置断点(b子程序名) –b行号条件设置条件断点 –d行号去除"行号"处的断点 5 ayup! study.Dayd GoodgoodSpring,2008 –L列出所有的断点$iis5,$jis15 $iis6,$jis21 $iis7,$jis28 –t跟踪执行main::(C:\bug.pl:6):print 1#!/usr/bin/perl-wd"\$iis$i,\$jis$j\n"; 2usestrict;DB<2>t 3my$j;Trace=on 4foreachmy$i(1..10){DB<2>c 5$j+=$i;$iis8,$jis36 6print"\$iis$i,\$jis$j\n";main::(C:\bug.pl:4):foreachmy$i 7}(1..10){ 81;main::(C:\bug.pl:5):$j+=$i; main::(C:\bug.pl:6):print C:\>bug.pl"\$iis$i,\$jis$j\n"; Defaultdiehandlerrestored.$iis9,$jis45 main::(C:\bug.pl:4):foreachmy$i LoadingDBroutinesfromperl5db.pl(1..10){ version1.07main::(C:\bug.pl:5):$j+=$i; Editorsupportavailable.main::(C:\bug.pl:6):print "\$iis$i,\$jis$j\n"; Enterhor`hh'forhelp,or`perldoc$iis10,$jis55 perldebug'formorehelp.main::(C:\bug.pl:4):foreachmy$i (1..10){ main::(C:\bug.pl:3):my$j;main::(C:\bug.pl:8):1; DB<1>b6$i==8Debuggedprogramterminated.Useqto DB<2>cquitorRtorestart, $iis1,$jis1useOinhibit_exittoavoidstopping $iis2