当前位置:文档之家› PERL和Python的比较研究

PERL和Python的比较研究

Perl和Python的比较研究随着系统管理的复杂化和网络运用的扩展,脚本语言在实际编程中的应用越来越广泛。

传统观念是:一般的高级语言如C/C++,Java,Delphi等用来编写主要的功能组件,如java的类和beans,用C/C++写的动态连接库,用VisualBasic写的控件等,而脚本语言如JavaScript,Vbscript,perl,python,sh等通常认为脚本语言是介于HTML应用的发展和脚本语言本身的发展,脚本语言的应用早就超出仅仅作为常规编程语言的辅助角色而用来直接开发应用系统,著名的网络流控制系统mrgt就是用perl开发的。

现在的脚本语言,其功能甚至强大到可以和一般高级语言相媲美,而且引入较新的程序机制和技术(如OO和异常处理),加上固有的简单易用,逐渐发展为程序开发的一支主流。

脚本语言的基本特征是语法简单,跨平台,类型宽松,解释执行。

早期的脚本语言?本文选择现今在自由软件开发里很具代表性和广泛使用的两种脚本语言perl和python进行比较研究,以期使读者能对这两种脚本语言的基本特点和新发展有一定的了解。

一、 两者初识Perl(可以看作Practical Extraction And Reporting Language的首字母)语言最早由Larry Wall开发,原始动机即作为一个文本提取和报告的实用语言,本来是基于UNIX系统,后来发展成能运行于几乎所有的机器体系和操作系统。

Larry Wall是坚实的免费软件拥护者,所以perl也成为免费软件之一(但不属GNU),按自由免费软件的一般模式发展和传播(perl中的源代码、标准库文件、可选模块及所有文档都免费提供,并被用户团体所支持)。

从1988年的最初诞生,到现在的perl 6系列版本,perl能够如此稳健蓬勃的发展是和它自由免费、简单高效(语法上象C和Unix的sh,解释执行前会简单编译,有点象java)、强可扩展性、数据类型灵活、面向对象以及有强大规范的用户团体交流(CPAN, Comprehensive Perl Archive Network)和幕后支持组织(CPAST, Comprehensive Perl Arcana Society Tapestry)分不开的。

Python最初出现在2000年前后,名字来源一喜剧团体Monty Python,并无实际代表意义。

Python最初由Guido van Rossum及其合作者设计开发,后来python开发小组多次重组,最终到Digital Creations。

Python和perl一样是在迅速稳定发展,目前的一个著名成功业绩是Digital Creations开发的zope,下一代开放源码应用服务器以及门户工具。

从抽象的功能和特点来说,python是和perl 最相像的语言,可能和perl的成功和python的较晚出现有关。

和perl一样,python 也是自由免费、简单高效、强可扩展性、数据类型灵活、面向对象的。

并且python 的功能相对更强大,更易于编写大程序,核心又较小。

尽管从抽象的角度,perl 和python两者有很大的相似,但作为不同的语言,他们却是又有许多差别,下文从几个主要的方面对两者进行深入的比较研究,尽量能找出它们的异同并对它们一些进行原理和模型层次的探讨。

下面我们先来看一下如何用这两个语言实现最简单的“hello!”程序,先对它们有个大概的印象。

在perl情形,先选择一个你比较喜欢的文本编辑器编写hello.pl程序如下:#This is a hello saying demoprint “what is your name?\n”;$name=<STDIN>;print “hello $name!”;在终端或命令行输入perl hello.pl或直接输入hello.pl程序将被解释执行,提示输入你的名字,输入名字xiao rong后程序在屏幕输出“hello xiao rong!”。

Python脚本运行有两种方式,一种是交互式的,一种是自动运行脚本。

交互式是在命令行输入python,然后进入交互状态(>>>为主提示符,…为从提示符):ActivePython 2.4.1 Build 245 (ActiveState Corp.) based onPython 2.4.1 (#65, Mar 30 2005, 09:33:37) [MSC 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, "!"然后在命令行输入python hello.py或hello.py发生的情形和perl一样。

所以从顶层模型来看,perl是一个完整的perl脚本输入自动执行。

一个perl 脚本文件和C/C++源程序类似,由一些语句和语句块组成,语句由“;”分隔,语句块由一对“{}”包括。

而python脚本既可自动执行,又能交互式运行。

而且python特别的一个地方使它采取缩进来标示分界和层次,不同于一般语言采用”;”和”{}”。

这种缩进方式的程序在运行时依赖一个栈来记录逻辑行的INDENT (缩进)和DEDENT(抽出)。

在读入脚本文件第一行之前,有个数值0压入栈底,这个0直到脚本运行完是不会被弹出的。

压进栈中的的数值是从底向顶严格增加的。

每次读到一行新的逻辑行,先比较它的缩进量和栈顶纪录的缩进量大小,大则表示进入下一层,此时把新的值压入栈并产生一个INDENT记号,小则表示此缩进量和前面某处一样(否则错误,这一点很严格),这时把栈中比它大的量都弹出,产生一个DEDENT记号。

如此可以获知每一行所在的层次,并逐行解释执行。

二、 数据类型脚本语言特点之一就是数据类型灵活,变量无需先声明,类型是靠值来动态确定的。

一个变量在一个程序中可以存储不同类型的值。

Perl支持的内置数据类型有数值(包括整数和浮点)、字符串(包括单个字符)、引用、列表和数组、关联数组(字典),其中前3类属标量,在变量名前面由”$”标示,列表和数组变量名由”@”标示,关联数组名由”%”标示。

即变量类型分三类,标量($varname),列表(@varname),关联数组(%varname)。

之所以采取这样的标示,很可能是和perl要支持引用相关,因为,要高效支持引用,就得很方便的知道引用的类型。

内置数据类型有内置方法支持,如数值的+-*/,字符串的连接、比较和匹配(详见下文的正则表达式讨论),列表的排序和翻转。

当然除了内置的类型,还支持新类型,面向对象的自定义对象,在面向对象分析小节使我们详细讨论。

Perl的大部分数据对象采取值模型,赋值时复制对象。

所以它把引用类型引入(类似C里的指针,但作为引用类型不能进任何算术运算),以方便数据的传递,在子程序小节将讨论引用的应用。

引用类型属标量,通过在普通变量前加”\”来获得引用的值,如$rarr=\@array;取值时用类型标示符作用在引用变量前即可,如@$rar得到数组@array的值,而$$rarr[i]取到@array第i元素(数组下表从0开始)。

Perl的文件管道句柄用标量来存储,这样很方便对文件和管道的操作。

另外,perl支持别名(alias),即在变量前加“*”,如:@array=(1,2,3);*arr=*array;$arr[0]=2;print "\@array:@array\n\@arr:@arr\n";这里有的一个问题是,如果同时有@array,$array,%array变量则解释器无法区分它们的别名。

别名实际是指向符号表项的指针,可以用来方便文件句柄和列表的操作。

别名在perl中又叫类型标识。

Python支持的内置基本类型有数值、字符串、链表、元组、字典。

由于设计时把python定位为完全的面向对象(包括数值类型,直接支持复数类型),对对象操作大多都是靠调用对象的方法来实现。

Python的不同类型变量定义无需特殊标示。

和perl不一样,python大部分对象采用引用模型,但是python不支持引用型变量。

象这类采用引用模型的语言,对对象一般分成两类,可以修改(mutable)和不可修改(immutable),不可修改的对象如果发生修改操作报错(但python返回”NotImplemented”型值)。

两者的列表数组和链表意义一样,是一个可以同时存多种标量值(整数,字符串等等)的一个线性表。

Python的链表允许插入、删除、倒置、排序、切片等操作,长度动态变化;perl的数组只允许在切片和首尾增加删除元素操作。

两者的关联数组和字典大致一样,存储的是健值对,允许检索,插入,删除。

Python 比perl多的元组是不可修改型(不能在其中增加、删除、重新赋值)可以当作列表常量(在这一点上和perl的列表更象,它们的输出形式都是“(item1,item2,…,itemn)”,python的链表数组形式为[item1,item2,…,itemn]),而且Python的元组允许嵌套,相当于广义表(但不允许原地插入删除)。

三、 控制流perl支持灵活多样的控制流。

有多种条件判断和循环并且支持循环控制和goto跳转。

首先说一下perl里的条件和条件表达式。

同C语言一样,perl没有另外的boolean类型,零和空等表示false,其余为ture。

条件可能来自比较,函数返回(如读取),状态和环境的判断(如文件是否存在)。

特别注意在perl中的有些比较操作,返回3真值1,0,-1。

如数值比较的”<=>”运算符和字符串比较的cmp操作。

逻辑运算有与(&&或and连接)、或(||或or连接)、非(!或not)、异或(xor)。

Perl除提供传统的if (<expression>) { <statement_block_1> } elsif (…) { <statement_block_2> } … else{ <statement_block_3> }条件控制外,还提供了特别的单行条件语句,语法为statement keyword condexpr。

相关主题