Perl语言入门(13 perl调试程序)

由于公司需要,本人最近在学习Perl这种脚本语言,本文是我在学习Perl的过程中总结出来的一些心得和笔记,希望能够帮助也在学习Perl的各位同僚。废话不多说直接上干货!!!

———————————————————————————干货分割线 —————————————————————————

1.什么是调试程序

P e r l调试程序是个P e r l解释程序的内置特性。它使你能够取出任何一个P e r l程序,然后逐个语句运行该程序。在运行过程中,你可以查看各个变量,修改这些变量,让程序运行较长

的时间,中断程序的运行,或者从头开始运行该程序。

2.启动调试程序

若要启动P e r l调试程序,必须打开操作系统的命令提示符。若你是D O S和Wi n d o w s用户,那么要打开M S - D O S的标准提示符C : \。如果是U N I X用户,这个提示符应该是你登录时显示的提示符(通常是%或$)。PS:本例中使用D O S提示符,以perl9中的程序为例(可查看博客perl9的内容)

 

启动调试程序:

perl -d Employee.pl

输出该命令后,会显示版本信息:

 


该调试程序首先显示版本号和help 提示。接着显示该程序的第一行可执行代码。由于第一个语句实际上包含7行,从“my @employees=”开始,以“);”为结尾,因此所有7行语句均显示一个描述,以说明它们来自什么文件,以及它们是在文件的哪一行或哪几行上找到的(第5至第11行)。

最后,你看到调试文件的提示符D B < 1 >。1表示调试文件正在等待它的第一个命令。调试程序提示符后面的光标正等待你输入命令。这时,你的P e r l程序实际上暂停在第一个指令-my @employees=(的前面。每当调试程序向你显示程序中的一个语句时,它就是准备要执行的语句,而不是上一个运行的语句。现在调试程序已经作好准备,等待你输入命令。

 

3.调试程序的基本命令

1>.h:帮助命令,所有可用命令均被输出.

2>.h h:帮助命令的变形版本,可以输出命令和语句的汇总.

3>.h cmd:输出某个命令的帮助信息.

4>.|:每次显示一屏幕命令.:查看一屏幕帮助可用:|h.

5>.n:运行perl程序的下一个语句

当你键入命令n后,perll就执行Employee程序的第5至11行语句。然后调试程序输出要执行的下一个语句(但尚未运行) m y ( $ L 1,$ F 1 ) = s p l i t’,’,$ a);并显示另一个提示符。

 

当程序运行到这个时候, @ e m p l o y e e s被初始化为5个名字和工资等。若要查看这些信息,可以将它们输出:

print @employees  [原始版]

显示:

 

也可以更清楚的显示输出信息,键入:

Print join(\n,@employees)  [升级版]

显示:

 

4.断点

如果不是每次执行一个指令,你可以让调试程序连续运行你的P e r l程序,直到到达某个语句,然后停止运行。这些停止运行的位置称为断点

若要设置断点,请使用b breakpoint命令,其中breakpoint可以是行号或子例程名。若要在第3 3行上设置断点,可以输入下面这个命令:

b 33

你可以使用l命令来浏览程序行,看看哪行适合添加断点(断点不能设置在花括号、标点符号、空行或只包含注释的代码行上)。命令l用于列出程序的下面1 0行。再次键l,可以列出下面的1 0行,如此类推。若要列出从某一行开始的程序,请键入l lineno,其中lineno是程序的行号。也可以设定要列出的行的范围,方法是键入命令l start-end。

键入:l

显示:

 

PS:,标号= = = >用于指明调试程序准备执行的当前行.

命令c:。命令c向调试程序发出指令,使P e r l程序运行到下一个断点或程序的结尾:

显示:

 

命令d:若要撤消程序中的断点,可以采用命令d,比如d line 或d submane.

命令R:重新启动你的程序,该命令使perl程序回到它的开始处.

命令s:单步进入设置断点的程序行中.s命令的作用是执行函数,然后在函数中的第1个指令处停止运行.

还可以在P e r l程序运行时修改程序里的变量。例如,若要给员工每小时临时增加2 . 5 0美元

的工资,可以输入下面的代码:

print $hourly

$hourly = $hourly + 2.50,如下:

 

命令q:退出调试程序

 

5.单命令行程序

这种程序的关键是在命令行上赋予P e r l的- e开关。- e的后面可以是任何P e r l语句,如:

Perl -e “print ‘hello,world’;”

显示:

 

插入多个语句:

perl -e "print 'hello,world';" -e "print'howzit goin?'"

显示:

 

-c:P e r l解释程序中的- c开关可供P e r l用来查看你的代码,以便找出语句上的问题,但是它实

际上并不运行程序,当程序正确时,显示:

 

当程序错误时,报错,显示:

 

 

6.<>与更多单命令行程序

迄今为止介绍的尖括号运算符( < >)具有两个功能:

1) 如果尖括号中间是文件句柄,尖括号运算符允许你读取文件句柄,比如< S T D I N >。

2) 如果尖括号中间是搜索模式,尖括号运算符能返回与该模式匹配的文件列表,这称为一个glob,比如< * . b a t >。

尖括号运算符还有另一个功能。一组尖括号运算符如果中间没有任何东西,那么它可以读取命令行上所有文件的内容;如果没有给出文件名,则可以读取标准输出。

Exp:

#!/usr/bin/perl -w
use strict;  
use warnings;
 
while(<>){
    print $_;
}
如果将上面的程序保存为E x a m p l e . p l,那么用下面这个命令行运行该程序:

perl -w Example.pl file1 file2 file3

就可使运算符< >读取f i l e 1的内容,每次读1行,然后读取f i l e 2,接着读取f i l e 3。


Perl程序的- n开关可用于将任何- e语句封装在该小程序中:

LINE:

While(<>){

    ...  #Your -e statements here.

}

因此,若要创建一个简短的单命令行程序,从输入数据中删除前导空格,你可以编写下面的命令:

Perl -n -e s/^\s+//g;print $_; file1

上面这个命令实际上运行类似下面这个P e r l程序:

LINE:

While(<>){

    s/^\s+//g;

    print $_;

}

在上面这个代码段中,名字为f i l e 1的文件被打开,并被赋予w h i l e循环中的$_,每次1行。该行用S / ^ \ S + / / g进行编辑,然后进行输出。- p与- n开关的作用相同,差别在于语句执行后各个文件行便自动输出。因此,重新编写上面这个命令行便产生下面这个命令行:

perl -p -e s/^\s+//g file1

当你用P e r l的单命令行程序来编辑一个文件时,必须注意不要在打开文件进行读取操作的同时,又试图对它进行写入操作,像下面这个例子那样:

perl -p -e s/\r//g dosfile > dosfile

上面这个代码段试图从称为dosfile的文件中删除回车符。问题是在P e r l命令被处理之前,dosfile文件已经被>dosfile改写。编辑文件的正确方法应该是将输入重定向到另一个文件中,并将文件改为它的原始名字,如下所示:

perl -p -e s/\r//gdosfile > tempfile

rename tempfile dosfile


7.使用引用调试程序:

若你的程序中有引用,你可以输出该引用,perl能够显示该引用指向什么结构,:

print $mystery_ref;

显示:ARRAY(0X1231920)

这意味着$mystery_ref;是对一个数组的引用.此外,变量也可以是对标量(SCALAR)、哈希结构(HASH)或子例程(CODE)的引用.若要输出$mystery_ref指向的数组,可以将它作为数组来处理,如下所示:

print join(‘,’,@{$mystery_ref});

 

当你在程序的调试窗口中输入调试命令:print $ref ,它若显示HASH(0X20222dac),显然,$ref是指一个哈希结构.然后输入命令:x $ref,

会显示:

在这个代码中,该引用包含一个带有两个元素(关键字‘ f r u i t’和‘ v e g e t a b l e’)的哈希

结构。该调试程序甚至能够输出列表的列表之类的复杂数据结构,如下所示:

 

上面的例子显示了一个引用$ a,它指向一个数组ARRAY(0x20170bd4)。而这个数组又包含3个别的数据引用,即ARRAY(0x20115484)、ARRAY(0x2011fbb4)和ARRAY(0x2011faa0),每个数组包含3个元素。


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PERL语言编程Perl 是一种能完成任务的语言。 当然,如果你的工作就是写程序,那么从理论上来讲,你可以使用任何“完整”的计算机语言来完成任务。但是从我们的经验来看,计算机语言的区别很大程度上不在它能干什么,而是在它做事情的时候是否简单。从一个极端来说,那些所谓的第四代语言做某些事情的时候相当容易,但是做其它一些事情的时候几乎不可能。从另外一个极端来看,那些所谓的工业级的语言在做任何事情的时候都几乎一样困难。 Perl 是不同的语言。从一开始,Perl 就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。 那什么是“简单工作”呢?当然就是那些你每天都要干的。你需要一种可以很容易操作数字,文本,文件和目录,计算机和网络,特别是程序语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西。而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理。当然,这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行Perl 做到了上述所有需求,甚至更多。 Perl 最初是当做一种 Unix 的胶水语言设计的,但是她早就移植到大多数其它操作系统里了。因为 Perl 几乎可以在任何地方运行,所以 Perl 可以说是当今最具有移植性的编程环境。要想写可移植的 C/C++ 程序,你得在程序里加上一大堆 #ifdef 标签来区分不同的系统。要想写可移植的 Java 程序,你必须理解每种新的 Java 实现的特质。要想写可移植的 shell,你可能要记住每条命令在每种操作系统上的语法,走运的时候你可能可以找到一些公共的东西。而要想写可移植的 Visual Basic 程序,那么你只需要对“移植”有个更灵活的定义就可以了。 我们很高兴的是 Perl 避免了所有这些问题,同时还保留了这些语言中的许多优点,同时还有一些自己的特色。Perl 的特色来自许多方面:它的特性集的工具,Perl 社区的创造性,以及开源运动的大环境。不过,许多这些特性都是混合的东西;Perl 的身世复杂,它总是把事物看成是优点的不同方面,而不是弱点。Perl 是“背黑锅我来”的语言。如果你觉得自己陷入一团乱麻之中,非常渴望自由,那么请使用 PerlPerl 是跨文化的。Perl 的爆炸性增长很大程度上是因为那些前 Unix 系统程序员的渴望,他们希望从他们的“老家”带着尽可能多的东西。对于他们而言,Perl 是可移植的 Unix 文化蒸馏器,是"此路不通"的沙漠中的绿洲。从另外一个角度来看,Perl 还可以从另外一个方向运转:在 Windows 上工作的 web 设计者通常会非常开心地发现他们的 Perl 程序可以不加修改地在 Unix 服务器上跑。 尽管 Perl 在系统程序员和 web 设计师中间非常流行,但这只是因为是他们最早发现 Perl 的,Perl 可以用于更广泛的用途。从 Perl 最早的文本处理语言开始,它已经发展成为一种非常复杂的,通用的编程语言,以及完整的开发环境,包括调试器,调节器,交叉引用,编译器,库,语法提示编辑器,以及所有其它“真正”的编程语言所具有的所有挂勾,只要你需要。当然这些东西都是让我们可能处理难的问题的东西,而且很多其它语言也可以做到这一点。Perl 之所以成为 Perl 是因为它从来不会因为保持简单事情简单化而丢失其他方面的特性。 因为 Perl 既强大又好用,所以它被广泛地用于日常生活的方方面面,从宇航工程到分子生物学,从数学到语言学,从图形处理到文档处理,从数据库操作到网络管理。很多人用 Perl 进行快速处理那些很难分析或转换的大批量数据,不管你是处理 DNA 序列,网页,还是猪肚皮的未来都无所谓。实际上,在 Perl 社区有一个笑话就是,下次股市大崩盘就很有可能是呢个家伙写的脚本里头有臭虫造成的。(不过,乐观点来看就是,任何还在失业的股票分析师仍然有可以利用的技巧。) Perl 的成功有许多原因。Perl 早在开源软件的名字出现之前就已经是一个成功的开源项目了。Perl 是自由的,并将永远自由下去。你可以在任何合适的场合使用 Perl,只需要遵守一个非常自由的版权就可以了。如果你在从事商业活动并且还想使用 Perl,那么用就是了。你可以把 Perl 嵌入到你写的商业软件中而不需要支付任何费用也没有任何限制。如果你碰上一个 Perl 社区解决不了的问题,那你也还有最后的一招:源程序本身。 Perl 社区不会在“升级”的伪装下租给你它们的商业秘密。而且 P
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值