欢迎来到咨信网! | 成为共赢成为共赢 咨信网助力知识提升 | 自信网络旗下运营:咨信网 自信AI创作助手 自信AI导航
咨信网
全部分类
  • 包罗万象   教育专区 >
  • 品牌综合   考试专区 >
  • 管理财经   行业资料 >
  • 环境建筑   通信科技 >
  • 法律文献   文学艺术 >
  • 学术论文   百科休闲 >
  • 应用文书   研究报告 >
  • ImageVerifierCode 换一换
    首页 咨信网 > 资源分类 > PDF文档下载
    分享到微信 分享到微博 分享到QQ空间

    Perl和Python的比较研究.pdf

    • 资源ID:226640       资源大小:1.01MB        全文页数:17页
    • 资源格式: PDF        下载积分:15金币
    微信登录下载
    验证码下载 游客一键下载
    账号登录下载
    三方登录下载: QQ登录
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    验证码: 获取验证码
    温馨提示:
    支付成功后,系统会自动生成账号(用户名为邮箱或者手机号,密码是验证码),方便下次登录下载和查询订单;
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    开通VIP
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    声明    |    会员权益      获赠5币      写作写作
    1、填表:    下载求助     索取发票    退款申请
    2、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    3、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
    4、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
    5、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【曲****】。
    6、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
    7、文档遇到问题,请及时私信或留言给本站上传会员【曲****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。

    Perl和Python的比较研究.pdf

    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模块。由于字符串对象的方法很丰富,没有正 则表达式,也能实现模式的查找、替换,但不如正则表达式方便自然。而要进行 正则表达

    26、式的操作,则需要re模块的支持。六、子程序和作用域每一个语言都会提供不同层次的抽象机制,常见的有语句块、子程序、自定 义数据结构、模块等等。Perl提供了子程序、包、模块三种抽象。作用域控制有语句块、子程序、包 三种作用域。Perl里的基本名字空间是包。包和模块详细在下一节再讨论,在这 里,我们先说一下子程序和语句块。Perl子程序涵盖了函数,这两个概念大部分时候不做区分。函数是输入到输 出的映射的一段代码,而子程序是完成一项任务的一个子功能的代码,很自然的,所有的子程序可以看成函数。Perl中没有专门的函数声明,在perl中用sub subname block来定义子程序。例:sub hel

    27、lo my$name=xiao rong”;#局部变量$name,$msg用来传递参数,设定了默认值my$msg=hello”;$name=$_0;#待传递的参数自动存储在列表_中$msg=$_l;print$msg,$name!;)这定义了一个名字为hello的子程序。可以通过&hello(name,msg)hello(name,msg)do hello(name,msg)或hello name,msg来调用(如果调用处在定义前,必 须用&型)。,默认情况下,所有建立的变量都会确认为在当前包范围内的全局变量。Perl 也提供作用域限定符,my表示局部私有变量,our表示共享全局变量(即所有

    28、包可见),local建立全局变量副本(对全局变量访问,访问完之后全局变量值复 原)。现在再回过来说一下子程序相关的。可以在任何地方定义子程序,这一点容 易从子程序的实际意思理解,这意味着允许子程序任意嵌套。因为函数即是子程 序,所以函数调用时参数不必用扩号限定,而可以象在命令行输入一个命令或运 行一个程序。子程序可以被引用,即子程序可以看成一种数据类型,用&标示,可以定义 一个引用指向子程序。如上例子程序hello,我们可以如下:$fun=&hello;&$fun(Mr.Zhang,“hello);定义引用$皿11指向它,并通过解析它调用函数。到此我们可以很好的理解函数的 多种调用方式了。函数

    29、参数传递时,所有的参数看成一个列表,都存在系统变量_里。因为 系统会自动把参数变成数组,所以在传递参数是要特别小心。比如2个数组 arrayl=(l,2),array2=(3,4),把这两个参数传给一个子程序,实际子程序得到 列表(1,2,3,4),或者说在子程序内部可见的是一个列表_=(1,2,3,4)。传哈希表给 子程序,会将哈希表转成键值对顺序列表。如果要传递哈希表或多个数组则可以 通过引用来实现:sub withrefmy($rarr,$rhash)=_;#_中第一个元素是数组引用,第二个为hash引用foreach($rarr).foreach$key(%$rhash).另外一个用来

    30、克服传值缺陷的做法是对列表使用别名,类似与C语言的指 针,传的是列表的起始地址,而不是复制整个列表的元素。用运算符来标 明,如;sub alias my(*arr尸*一;foreach(arr).)array=(l,2,4,3);alias(*array);因为perl参数的类型和数目一般不在声明时指定(函数原型的概念是在最近 的perl版本中才引入),所以默认子程序是处理不定个数和类型的,当然通过值 _可以得知参数的个数,但一般更常用的是shift函数。shft函数去列表的第一 个殖并从中删除,默认对_操作。在perl新近版本可以使甬函数原型来限定参数的个数和类型。用相应的类型 标示符表示接

    31、受的参数的类型,多个参数中间以“;”间隔。另外子程序可以接 受一些诸如 locked、lvalue、method 等选项。Perl预定义了三个子程序,分别在特定的时间执行,它们是:BEGIN子程序 在程序启动时被调用;END子程序在程序结束时被调用;AUTOLOAD子程序在 找不到某个子程序时被调用。你可以自己定义它们,以在特定时间执行所需要的 动作。若同一个预定义子程序定义了多个,则BEGIN顺序执行,END逆序执行。除了子程序外,perl还支持语句块结构(有时也成为非限定块),可以给语句 块命名。块类似与一段循环,不过它值运行一次,可以用last,next,redo控制。例如下属语句用来模

    32、拟C/C+语言中的switch语句:S WITCH:if($gen=male)print Mr.;last S WITCHif($gen=female)print Ms.;last S WITCH)语句块里同样可以定义变量,前套子程序和语句块。Python提供了函数、模块、和类三个层次的抽象。并且使用名字空间在应用 程序中存储对象的信息和数据。关于作用域规则,有所谓的“LGB”规则,即名 字空间查找为先局部(local),再全局(global),再内置(built-in);函数和类不会自 动继承父作用域。局部是指该抽象层次里,全局指当前python执行文件,内置 是指语言定义,随处可见的一些量

    33、和函数。例如:name=xiao rong#global 的 namedef hello():#global 的 hello 函数name=raw_input(4tinput your name,please:,)#hello 函数内 local 的 name,built-in 的函数raw inputprint“nhello“,name,!”如果默认的“LGB”规则不能确定名字(出现通常所说的陷阱),则需要特 别指定。在下面的子程序说明时将说明这一细节。在python里通过def fun(argl,arg2,)来定义一个函数。采用命名参数制(相 应说法有关键字参数调用),即按名字对应传递;支

    34、持默认值;参数也是对象,且采取引用模型。有默认参数值,且有参数缺省时应注意参数排合适的顺序消除 歧义。下面定义一个函数,它在一定的字符边框里格式输出问候语:def greeting(name,greetmsg=hello,ch=*):#name 为要问候人的姓名 stL”rT+greetmsg+”,+name+!#greetmsg 为问候语i=0#ch为边框字符while(ilen(str):print ch,i=i+l print str i=0while(iprntinfb();输出的结果为:name:xiao rong age:22。所以,perl的类是包,带有构造函数new。对象只不过

    35、是同该包绑定的数据 引用(我们可以查看$1的值即print$st,输出结果为S TU=ARRAY(0 x200f99c),与普通引用的值不大一样),在上例中数据引用是一个列表,一般对象数据为哈 希数组。Perl类的方法只不过是一个perl子程序而已,也即通常所说的成员函数。Perl 的方法定义不提供任何特殊语法,但规定方法的第一个参数为对象或其被引用的 包。Perl有两种方法:静态方法和虚方法(静态方法类似与C+的,但虚方法不 同)。静态方法第一个参数为类名,虚方法第一个参数为对象的引用。方法处理 第一个参数的方式决定了它是静态的还是虚的。静态方法一般忽略掉第一个参 数,因为它们已经知道自己在

    36、哪个类了,构造函数即静态方法。虚方法通常首先 把第一个参数shift到变量self或this中,然后将该值作普通的引用使用。Perl 的对象方法调用模型是生成一个方法对象,即从对象和它调用的子程序生成一个 新的“方法”,然后按普通的子程序执行。Perl的类封装通过包的作用域限制和子程序的作用域限制以及在EXPORT 数组来控制,继承主要是通过IS A数组来实现,在IS A数组中的所有类都是 基类,但基类数据不会自动继承,需要程序员写相应代码。我们用一个例子GS TU 继承前面的S TU类来说明:package GS TU;require Exporter;require S TU;IS A=q

    37、w(Exporter,S TU);EXPORT=qw(pmtinfo);sub new$this=new S TU($_1,$_2);#调用基类S TU的构造函数来继承基类的数据$this2=$_3;#列表增加一项研究方向bless$this;sub pmtinfo#重载方法 prntinfb$self=shift;$self-S TU:prntinfb();pmit researching area:$self2n1;上面的代码还涉及到了方法的重载(它们属于不同的名字空间)。继承实际是提供 了一个方法的包搜索空间,如果在本类和基类中找不到,则调AUTOLOAD子程 序,再不就看UNIVERS

    38、 AL子程序是否存在并调用或报错。Perl跟踪对象的链接数目,当某对象的最后一个应用释放到内存池时,该对象 就自动销毁。对象的析构发生在代码停止后,脚本将要结束时。对于全局变量而 言,析构发生在最后一行代码运行之后。如果你想在对象被释放之前获取控制权,可以定义DES TROY。方法。DES TROY。在对象将释放前被调用,使你可以做一 些清理工作。DES TROY。函数不自动调用其它DES TROY。函数,Perl不做内置 的析构工作。如果构造函数从基类多次bless,DES TROY。可能需要调用其它类 的DES TROY。函数。当一个对象被释放时,其内含的所有对象引用自动释放、销毁。一般来

    39、说,不需要定义DES TROY。函数,如果需要,其形式如下:sub DES TROY#Add code here.#因为多种目的,Perl使用了简单的、基于引用的垃圾回收系统。任何对象的引 用数目必须大于零,否则该对象的内存就被释放。当程序退出时,Perl的一个彻 底的查找并销毁函数进行垃圾回收,进程中的一切被简单地删除。在UNIX类的 系统中,这像是多余的,但在内嵌式系统或多线程环境中这确实很必要。可以看出,perl的面向对象概念是比较模糊的,而且一般的建议也是能不用 它的面向对象机制,尽量不用使用。前面说过,python作为面向对象的语言比较彻底,很多基本的内置类型就是 面向对象的。如复数

    40、数值类型,num=3+0J,可.以去它的实部num.real。他的类有 分明的数据和方法说明,如我们定义前面perl下S TU相同意义的类:class S TU:def _init_(self,name,age):#self表示对象本身的引用,实际是一隐藏参数self.name=nameself.age=agedef prntinfb(self):print name,age#定义一个对象stst=S TU(xiao rong,22)st.prntinfo()由python的数据抽象和作用域规则确定数据的封装性,这一点和perl相同。Python类继承和C+类似,我们延续上面的例子:class

    41、 GS TU(S TU):def _init_(self,name,age,area):S TU._init_(self,name,age)self.area=areadef pmtinfb(self):S TU.prntinfo(self)print research area:+self.area因为python不支持重名函数(函数重载),所以不支持多个构造函数(_init一),这不同C+和java等面向对象语言。Python允许定义所谓的虚构函数_del_(),尽管和perl 一样语言会进行自动废料收集,但_del_()允许对象在销毁时作二些 更复杂的工作。九、异常处理象python支持

    42、异常处理机制的脚本语言里是少有的。这得益于python设计 的类似于java的完全00,即根本上面向对象。所有的异常是Exception的字类,内置了诸如有语法错、算术运算异常、查找异常、环境异常、名字错、键盘中断、属性错、导入错、运行时错、类型错、断言错、引用错、内存用完、系统异常等 基本异常类,涵盖大部分可能出现的异常并自动检查,可以很方便地进行异常控 制。Python的异常处理采取终止模型(termination model)。捕捉异常语法 try.except形式,用raise产生一个异常如:import sysARGV=sys.argva=eval(ARGVl)b=eval(ARGV

    43、2)#按整数读入参数a,btry:#监察异常print a/b#打印 a/bexcept ZeroDivisionError:#处理被 0 除的异常print divided by zero!raise S yntaxError#引发一个语法错误的异常,这样将导致脚本终止一个语言要支持异常处理,首先应该定义各种异常,并有引发和捕获异常的 机制。一般异常的引发是由系统自动抛出,并且有默认的捕获和处理;程序员可 以在程序设计时加入代码检查看是否由某种类型的异常抛出,并作相应处理;异 常就近(在最近的一层里)处理,否则逐层传递,没有匹配的捕获,则程序出错 终止。所以相比而言,perl的异常处理机制很

    44、原始,类似C语言,靠程序员检查,然后进行简单的处理,如输出错误信息,退出程序或警告。要想实现上例情形的 perl脚本可能是:$a=;$b=;die(divided by zero!)if b=0;#如果除数为0退出,别的情形可能用warn警告print a/b;如果有错误的预先检测,如上里的if语句,则异常情况可以被特别处理;但如 果不进行这种检测,则一旦异常出现,整个脚本被中断或异常将影响其它语句。针对这种情况,perl里的eval函数将有特别的用处。当脚本包含一个eval函数 调用时,一个perl解释器新的请求将被建立,即运行了另外的一个解释器,并且 这个解释器的执行阶段解释执行提供给ev

    45、al的语句块或表达式,一旦运行结束,该解释器运行终止。eval函数的最大特点是运行时间执行perl源代码,并且和主 脚本代码的运行保持很大的独立性。所以eval代码出现异常不会严重影响或中 断整个脚本的继续执行。eval可以接受单个表达式或语句块的输入,要特别注意 的是当eval一个语句块时,语句块是和其它部分一道被编译的,等到eval是才 执行,所以可能不具有你所期望的动态效果,如想动态的使用一个包:$mod=$windows?9DB1:Win325:5DBT;#根据操作系统的选择不同的模块eval use$mod;#在eval块中打开模块$mod,但实际这种情况下$mod是没有值的 eva

    46、l的块和普通的语句块不同,它后面的不可少,它是相对独立的解释单 位。要实现上例的想法,可以用eval表达式:$mod=$windows?DBI:win32:DBI;eval use$mod;#表达式的值是在运行中求得的,故此时S mod有值eval块中的异常信息将存储在系统变量$中,可以通过访问该变量了解代码的 运行状况。在perl标准库里有为方便异常处理的一些模块如Carp等,但错误的传递和 逐层匹配处理能力较差,依赖于程序员的个人设计,语言不自动检查。十、并发控制并发(concurrence)是计算一个重要发展方向,也是克服硬件速度发展相对停 滞、待处理问题规模复杂度不断增长的有效机制。很

    47、多操作系统通过多进程和多 线程来实现并发处理。进程可以说是一个一个运行中的程序,有自己独立的内存 空间和其他资源。而线程可以看成轻量级的进程,或进程的一个执行体,同一进 程内的线程共享内存和资源以及一些全局环境和变量。进程和线程以及多任务的 其它一些细节在这里不介绍了。Perl和python这两种脚本语言设计时都考虑了 对支持进程和线程控制的支持。Perl直接支持进程控制,可以在脚本运行时直接fork出一个子进程,在UNIX 系统这将运行系统调用fork,在win系列系统创建的是伪进程(模拟子进程,生 存期依赖它的创建进程)。fork出的子进程直接运行进跟其后面的块中的代码。进程间的通信组要依

    48、赖与信号。Perl支持POS IX标准,定义了其中的大部分信 号,信号和信号句柄存在字典中,这和通常的信号句柄系统大不一样。关键字时 信号名字(比POS IX有所简化,把S IG省略了,如S IGINT简化为INT),而相 关值是当收到信号时应执行的动作函数的引用,$n$S IGINT=sub print“got S IGINT”;,表示该进程收到INT信号时将打印出got S IGINT。另外一个进程 间交换信息的方式是通过管道,与shell中控制类似。Perl中通过包Thread支持多线程。创建线程时将让它执行的函数和参数传给 它,如:use Thread;$t=new Thread(&s

    49、ubprog,args);#创建一个新线程执行 subprog 子程序Thread包中有join方法可以控制父线程等待子线程。线程的一些基本控制如获 得名称,用户,父线程号,进程号在Thread模块里有专门的函数,在此不细说。当线程间共享变量时可以通过条件变量或信号量(semaphore)来控制。通过 lock函数给变量加锁,有三个独立的函数可以去锁:cond_wait cond signal和 cond_broadcast分别对应有线程在该变量上等待,发送信耳,广播信号信号量 能够同来指示一些线程事件,所提供的信息是以数字出现,并且这些数字能相应 的增加或减少,通常的方法是建立一个和可以共享

    50、的资源相关联的信号量。在 perl中如下建立信号量控制:$sema=new Thread:S emaphore(0);#建立信号量并赋初值0,假定它和$丫21 变量关联$val=0;sub sub 1 while(l)if($sema0)($sema-down;$val+;wait(5);if($val100)last;$sema-up;sub sub2 while(l)if($sema0)($sema-down;$val;wait(10);if($valup;$tl=new Thread&subl;#$tl 线程将执行 sub 1$t2=new Thread&sub2;#$t2 线程将执行


    注意事项

    本文(Perl和Python的比较研究.pdf)为本站上传会员【曲****】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4008-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表




    页脚通栏广告
    关于我们 - 网站声明 - 诚招英才 - 文档分销 - 便捷服务 - 联系我们 - 成长足迹

    Copyright ©2010-2024   All Rights Reserved  宁波自信网络信息技术有限公司 版权所有   |  客服电话:4008-655-100    投诉/维权电话:4009-655-100   

    违法和不良信息举报邮箱:help@zixin.com.cn    文档合作和网站合作邮箱:fuwu@zixin.com.cn    意见反馈和侵权处理邮箱:1219186828@qq.com   | 证照中心

    12321jubao.png12321网络举报中心 电话:010-12321  jubao.png中国互联网举报中心 电话:12377   gongan.png浙公网安备33021202000488号  icp.png浙ICP备2021020529号-1 浙B2-20240490   



    关注我们 :gzh.png  weibo.png  LOFTER.png