Perl和Python的比较研究.pdf
《Perl和Python的比较研究.pdf》由会员分享,可在线阅读,更多相关《Perl和Python的比较研究.pdf(17页珍藏版)》请在咨信网上搜索。
1、Perl和Python的比较研究随着系统管理的复杂化和网络运用的扩展,脚本语言在实际编程中的应用越 来越广泛。传统观念是:一般的高级语言如C/C+,Java,Delphi等用来编写主要 的功能组件,如java的类和beans,用C/C+写的动态连接库,用VisualBasic写 的控件等,而脚本语言如JavaS cript,Vbscript,perl,python,sh等通常认为脚 本语言是介于HTML应用的发展和脚本语言本身的发展,脚本语言的应用早就超 出仅仅作为常规编程语言的辅助角色而用来直接开发应用系统,著名的网络流控 制系统mrgt就是用perl开发的。现在的脚本语言,其功能甚至强大到
2、可以和一 般高级语言相媲美,而且引入较新的程序机制和技术(如OO和异常处理),加 上固有的简单易用,逐渐发展为程序开发的一支主流。脚本语言的基本特征是语 法简单,跨平台,类型宽松,解释执行。早期的脚本语言?本文选择现今在自由 软件开发里很具代表性和广泛使用的两种脚本语言perl和python进行比较研究,以期使读者能对这两种脚本语言的基本特点和新发展有一定的了解。一、两者初识Perl(可以看作 Practical Extraction And Reporting Language 的首字母)语言 最早由Larry Wall开发,原始动机即作为一个文本提取和报告的实用语言,本来 是基于UNIX系
3、统,后来发展成能运行于几乎所有的机器体系和操作系统。Larry Wall是坚实的免费软件搦护者,所以perl也成为免费软件之一(但不属GNU),按自由免费软件的一般模式发展和传播(perl中的源代码、标准库文件、可选模 块及所有文档都免费提供,并被用户团体所支持)。从1988年的最初诞生,到现 在的perl 6系列版本,perl能够如此稳健蓬勃的发展是和它自由免费、简单高效(语法上象C和Unix的sh,解释执行前会简单编译,有点象java)、强可扩展性、数据类型灵活、面向对象以及有强大规范的用户团体交流(CPAN,Comprehensive Perl Archive Network)和幕后支持
4、组织(CPAS T,Comprehensive Perl Arcana S ociety Tapestry)分不开的。Python最初出现在2000年前后,名字来源一喜剧团体Monty Python,并无 实际代表意义。Python最初由Guido van Rossum及其合作者设计开发,后来 python开发小组多次重组,最终至Digital Creationso Python和perl 一样是在迅 速稳定发展,目前的一个著名成功业绩是Digital Creations开发的zope,下一代 开放源码应用服务器以及门户工具。从抽象的功能和特点来说,python是和perl 最相像的语言,可能
5、和perl的成功和python的较晚出现有关。和perl 一样,python 也是自由免费、简单高效、强可扩展性、数据类型灵活-、面向对象的。并且python 的功能相对更强大,更易于编写大程序,核心又较小。尽管从抽象的角度,perl 和python两者有很大的相似,但作为不同的语言,他们却是又有许多差别,下 文从几个主要的方面对两者进行深入的比较研究,尽量能找出它们的异同并对它 们一些进行原理和模型层次的探讨。下面我们先来看一下如何用这两个语言实现最简单的“hello!”程序,先对 它们有个大概的印象。在perl情形,先选择一个你比较喜欢的文本编辑器编写 hello.pl程序如下:#This
6、 is a hello saying demoprint“what is your name?n;$name=;print“hello$name!;在终端或命令行输入perl hello.pl或直接输入hello.pl程序将被解释执行,提示输 入你的名字,输入名字xiao rong后程序在屏幕输出“hello xiao rong!”。Python脚本运行有两种方式,一种是交互式的,一种是自动运行脚本。交互 式是在命令行输入python,然后进入交互状态(为主提示符,为从提示符):ActivePython 2.4.1 Build 245(ActiveS tate Corp.)based onPy
7、thon 2.4.1(#65,Mar 30 2005,09:33:37)MS C v.1310 32 bit(Intel)on Win32Type help,copyright,credits or license for more information.name=raw_input(what is your name?n)what is your name?xiao rong print hello,name,!hello,xiao rong!或者编好脚本文件hello.py如下:name=raw_input(what is your name?n)print hello,name,!然后
8、在命令行输入python hello.py或hello.py发生的情形和perl 一样。所以从顶层模型来看,perl是一个完整的perl脚本输入自动执行。一个perl 脚本文件和C/C+源程序类似,由一些语句和语句块组成,语句由分隔,语句块由一对“”包括。而python脚本既可自动执行,又能交互式运行。而 且python特别的一个地方使它采取缩进来标示分界和层次,不同于一般语言采 用可和“。这种缩进方式的程序在运行时依赖一个栈来记录逻辑行的INDENT(缩进)和DEDENT(抽出)。在读入脚本文件第一行之前,有个数值0压入栈 底,这个0直到脚本运行完是不会被弹出的。压进栈中的的数值是从底向顶严
9、格 增加的。每次读到一行新的逻辑行,先比较它的缩进量和栈顶纪录的缩进量大小,大则表示进入下一层,此时把新的值压入栈并产生一个INDENT记号,小则表 示此缩进量和前面某处一样(否则错误,这一点很严格),这时把栈中比它大的 量都弹出,产生一个DEDENT记号。如此可以获知每一行所在的层次,并逐行 解释执行。二、数据类型脚本语言特点之一就是数据类型灵活,变量无需先声明,类型是靠值来动态 确定的。一个变量在一个程序中可以存储不同类型的值。Perl支持的内置数据类型有数值(包括整数和浮点)、字符串(包括单个字 符)、引用、列表和数组、关联数组(字典),其中前3类属标量,在变量名前面 由标示,列表和数组
10、变量名由“”标示,关联数组名由“”标示。即变量类型 分三类,标量($vamame),列表(varname),关联数组(丫191116)。之所以采 取这样的标示,很可能是和perl要支持引用相关,因为,要高效支持引用,就得 很方便的知道引用的类型。内置数据类型有内置方法支持,如数值的+-*/,字符 串的连接、比较和匹配(详见下文的正则表达式讨论),列表的排序和翻转。当然 除了内置的类型,还支持新类型,面向对象的自定义对象,在面向对象分析小节 使我们详细讨论。Perl的大部分数据对象采取值模型,赋值时复制对象。所以它 把引用类型引入(类似C里的指针,但作为引用类型不能进任何算术运算),以 方便数据
11、的传递,在子程序小节将讨论引用的应用。引用类型属标量,通过在普 通变量前加”来获得引用的值,$n$rarr=array;取值时用类型标示符作用在引 用变量前即可,如$也得到数组20丫的值,而$出0口取到array第i元素(数组下表从0开始)。Perl的文件管道句柄用标量来存储,这样很方便对文件和管道的操作。另外,perl支持别名(alias),即在变量前加“*”,如:array=(l,2,3);*arr=*array;$arr0=2;print array:arraynarr:arrn;这里有的一个问题是,如果同时有array,$array,%array变量则解释器无法区 分它们的别名。别名实
12、际是指向符号表项的指针,可以用来方便文件句柄和列表 的操作。别名在perl中又叫类型标识。Python支持的内置基本类型有数值、字符串、链表、元组、字典。由于设计 时把python定位为完全的面向对象(包括数值类型,直接支持复数类型),对对 象操作大多都是靠调用对象的方法来实现。Python的不同类型变量定义无需特殊 标示。和perl不一样,python大部分对象采用引用模型,但是python不支持引 用型变量。象这类采用引用模型的语言,对对象一般分成两类,可以修改(mutable)和不可修改(immutable),不可修改的对象如果发生修改操作报错(但python返 回“Notlmpleme
13、nted”型值)。两者的列表数组和链表意义一样,是一个可以同时存多种标量值(整数,字 符串等等)的一个线性表。Python的链表允许插入、删除、倒置、排序、切片等 操作,长度动态变化;perl的数组只允许在切片和首尾增加删除元素操作。两者 的关联数组和字典大致一样,存储的是健值对,允许检索,插入,删除。Python 比perl多的元组是不可修改型(不能在其中增加、删除、重新赋值)可以当作列 表常量(在这一点上和perl的列表更象,它们的输出形式都是”(iteml,item2,.,itemn)”,python 的链表数组形式为加1111,让61112,.,证11111),而 且Python的元组
14、允许嵌套,相当于广义表(但不允许原地插入删除)。三、控制流perl支持灵活多样的控制流。有多种条件判断和循环并且支持循环控制和 goto跳转。首先说一下perl里的条件和条件表达式。同C语言一样,perl没有另 外的boolean类型,零和空等表示false,其余为ture。条件可能来自比较,函数 返回(如读取),状态和环境的判断(如文件是否存在)。特别注意在perl中的有 些比较操作,返回3真值1,0,-1。如数值比较的”运算符和字符串比较的 cmp操作。逻辑运算有与(&或and连接)、或(|或or连接)、非(域not)、异加xor)。Perl 除提供传统的 if()elsif()else
15、条件控制外,还提供 了特别的单行条件语句,语法为statement keyword condexpr。其中keyword可为 if、unless、while 或 until,如:print(This is zeroAn)if($var=0)和 print(This is zero.n)unless($var!=0),虽然条件判断写在后面,但却是先执行的,只有满 足条件才执行前面的语句。Perl 支持 while 循环 while(),until 循 环 until(),类 C 的 for 循环,针对列表(数 组)每个元素的循环 foreach,语法为:foreach localvar(list
16、expr)statement block;(此处的循环变量localvar是个局部变量,如果在此之前它 已有值,则彳庙环后仍恢复该值。在循环中改变局部变量,相应的数组变量也含改 变),do 循环 do statement block while or until(condexpr);do 循环至少执行一 次循环。退出循环为last,与C中的break作用相同;执行下一个循环为next,与C 中的continue作用相同;Perl特有的一个命令是redo,其含义是重复此次循环,即循环变量不变,回到循环起始点,但要注意,redo命令在do循环中不起作用。Goto语句和C完全一样。Python的控制
17、结构相比方式少一些,但能满足通常的需要(因为支持while 型的循环)。Python的条件表达式值有Booleans类型值True和False表示,但是 Booleans是作为Integers即整数的子类型,其中Ture就是1,False就是0。Python 的条件值同样由比较,函数,环境和状态产生。有与(and)、或(or)、非(not)运 算。Pyhton支持多分支的if.elif.else条件判断,但书写时必须注意缩排对齐。Python支持所谓的对序列中(包括链表和元组)的元素的for循环“for elements in S equence:,此时要特别注意在循环过程中不应改变列表形状;
18、python还支持 while 循环,while expression:block else:block。Python 循环时除支持类似 C 中break,continue等跳转控制语句外,还有一种pass语句,它什么都不做。四、解释和环境很多脚本语言的运行是需要脚本解释器或专门的虚拟机(类似Java的 JVM)O而且一般脚本语言不能直接生成可执行文件,所以与环境和操作系统的 交互必须通过一些间接的方式,如更多的通过环境变量和特殊变量。这一节我们 来看一下perl和python的解释执行与环境交互。Perl和perl函数的执行可以被某些环境变量影响,许多环境变量在安装perl 时被操作系统或s
19、hell自动设置,有些变量可以在脚本运行时被修改和配置。Perl 通过内置变量哈希表ENV提供到当前解释器的环境变量的接口,常用的环境 变量包括HOME,PATH,PWD,HOS T,US ER等,环境变量在不同的操作系 统下是有差别的。除了环境变量外,还有一些特殊变量可以用来控制perl运行或 为perl运行提供外部信息,如人口6丫存储传递给程序的参数,_存储传递给 子程序的参数,$表保存perl版本,$保存最后一次调用eval产生的错误,$?保存最后一个子进程返回状态,INC包含包搜索目录列表,INC保存通过do 和require得到的程序中每一个文件的列表,%S IG表示信号句柄(在第十
20、节会详 细介绍),S TDERR,S TDIN,S TDOUT分别是标准错误、输入、输出句柄。Perl 可以通过system函数运行程序或外部命令,通过fork创建子进程。Perl在解释执行前实际有一个粗略的编译,解释执行的是操作码(由C语言 编写的一些基本操作指令,类似与Java的虚拟机)。尽管perl是以脚本语言,可 以使用perlcc命令或其它工具将perl脚本编译成可执行文件(在windows下.exe 文件)。但是,编译成可执行文件不会进一步提高perl代码的执行效率,因为它 只是进一步把操作码翻译成机器指令,而不会进一步的优化机器码。Python通过sys和os两个模块来和系统与环
21、境进行交互,其中sys模块处理 一些与具体系统无关的,而os是针对具体系统的。在sys模块的argv数组中可 以获得命令行参数,stdin、stdout、stderr分别获得标准输入输出错误的句柄,可 以通过sys里的函数exit终止脚本的运行。另外sys模块还提供了一些解释器的 信息,如modules是当前被加载的模块,path是个字典,是模块和路径对。os 模块的主要功能是确认用户和进程环境,对诸如文件和文件系统这样的外部系统 的进行控制和通信。os中的字典environ提供对当前进程的环境变量的访问,函 数system和exec用于启动其它程序或外部命令。关于进程的控制和通信在第十 节并
22、发控制将进一步讨论。Python在解释前也是会进行编译的,这一点在使用import语句导入一个的 模块时看得更清楚,因为它将源代码.py”编译成“pyc”再导入,每次导入都会比 较”.py和.pyc”文件的时间戳,确定是否需要重新编译。Python的解释器构架中 有一部分就叫做PVM(python虚拟机);Python脚本解释器核心比较小,很容易 用其他高级语言实现,如现在比较流行的Jython,可以看成java和python的一 个结合。五、正则表达式本来正则表达式一般不在的程序语言设计时考虑。但考虑到脚本语言,尤其 是早期的脚本语言如awk,很大程度上是为加强在Unix S hell上的报
23、文处理而设 计。从这个程度上来说,perl的内置强大正则表达式处理能力更有传统脚本语言 的风格。正则表达式处理一般包括模式串的匹配、提取、替换、分割。而模式串 用一个正则表达式来描述。如一般语言里的标示符用 a.z|A.Z(表示以字母开头任意个字母或数字的字符串。Perl语言支持对字符串进行模式匹配、替换等丰富的正则表达式相关操作,使用非常方便。和通常郑泽表达式记号差不多:在一对“/”里表示模式串,即/pattern/;代表任一字符,”*”表示前一字符的任意重复,”+表示前一字符的 至少一次重复;中表示字符可选集,表示禁止字符;特殊字符用转 义,表示选择项,n指定n次重复等等。“=”是模式匹配
24、符,表达式$str=/pat/意思是判断$str里面是否存在“pat”串,返回第一个匹配的串(有的话为非零值即 真),可以用它给一个数组赋值,match=$str=/pat/g(g”选项表示匹配所有可 能)。下面举一个复杂点例子来说明正则表达式的使用,在一个文本文件里找出 所有的 emial 地址(xxxxxx.xxx.xxx)输出:#prntemail.pl从email.data文件中找出所有的email地址$file=email.data;if(open($dfile,$file)#打开文件data=;#读数据fbreach$line(data)printemailn if(email=$
25、line=/A.+A.+.A.+.A.+/g);#上一行语句为从每行中找出所有的xxxxxx.xxx.xxx形式的串并输出)close($file);)else print error in open file$filen另一常见用法是用split(/pat/,$str)将字符串用某模式分成多个单词。此外,=运算还可以带许多选项来提高使用的灵活性,这里不进一步细说。Python语言本身不支持正则表达式操作。进行文本处理时,除内置的字符串 基本操作外,可能还需使用string模块。由于字符串对象的方法很丰富,没有正 则表达式,也能实现模式的查找、替换,但不如正则表达式方便自然。而要进行 正则表达
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Perl Python 比较 研究
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【曲****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【曲****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。