加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl脚本语言

发布时间:2020-12-16 00:11:33 所属栏目:大数据 来源:网络整理
导读:连接:http://zh.wikipedia.org/wiki/Perl#.E6.97.A9.E6.9C.9F.E7.89.88.E6.9C.AC Perl 是一种高级、通用、直译式、动态的程序语言。最初设计者拉里·沃尔( Larry Wall )为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在198

连接:http://zh.wikipedia.org/wiki/Perl#.E6.97.A9.E6.9C.9F.E7.89.88.E6.9C.AC


Perl是一种高级、通用、直译式、动态的程序语言。最初设计者拉里·沃尔(Larry Wall)为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在1987年12月18日发表。

Perl借取了C、sed、awk、shell脚本以及很多其他编程语言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。目前拉里·沃尔已经开发Perl 6,来作为Perl的后继;不过,Perl 6语言的语法有很多转变,所以Perl 6被视为Perl家族中的另一个语言。[2]

目录

? ?[隐藏]?
  • 1?历史
    • 1.1?早期版本
    • 1.2?早期的Perl 5
    • 1.3?2000年至今
    • 1.4?名称
    • 1.5?骆驼标志
      • 1.5.1?洋葱标志
  • 2?Perl简介
    • 2.1?Perl语言的中心思想
    • 2.2?优点
    • 2.3?缺点
  • 3?Perl的语法
    • 3.1?Perl的Hello World程序
    • 3.2?变量
    • 3.3?判断语句
    • 3.4?循环语句
  • 4?函数
  • 5?Perl的应用
    • 5.1?Perl Data Language
    • 5.2?Perl诗经
    • 5.3?以Perl编写的软件
  • 6?竞争对手
  • 7?Perl 6
  • 8?注释
  • 9?参考文献
  • 10?外部链接
    • 10.1?中文资源、社区
    • 10.2?英文资源、社区
  • 11?参见

[编辑]历史

[编辑]早期版本

拉里·沃尔在1987年开始写作Perl,那时他正在Unisys当程序员[3],并且在1987年12月18日把1.0版本发布到了comp.sources.misc新闻组[4]。这个语言在接下来的几年内很快地发展起来。

Perl 2,于1988年发布,特色是有一个更好的正则表达式引擎,Perl 3,于1989年发布,添加了对二进制数据流的支持。

从前,Perl唯一的文档是一个逐渐变长的手册页。在1991年,《Programming Perl》(被许多Perl程序员因封面称为“骆驼书”),出版了,而且变成了一个真正的Perl语言的参考资料。同时,Perl版本号变成了4,不是因为这个语言的重大改变,而是因为这本书的特殊意义。

[编辑]早期的Perl 5

Perl 4的一系列维护的版本,最后一版是1993年的Perl 4.036。那时,沃尔废弃了Perl 4,开始开发Perl 5。Perl 5的最初始设计持续到了1994年。《perl5-porters》邮件列表于1994年5月为了共同移植Perl 5而创建。这将主要的论坛留给了Perl 5的开发,维护,和移植[5]

Perl 5.000于1994年10月17日发布[6]。这是一个几乎完全重写了的直译器,而且它给这个语言添加了很多新的特性,包括对象,引用,局部变量,和模块。很重要地,模块提供了一个不用修改直译器就可以扩展语言的方法。这使得核心的直译器非常稳定,即使它允许一般的Perl程序员添加新的语言特性。从此,Perl 5的开发就活跃起来了。

Perl 5.001于1995年3月13日发布。Perl 5.002于1996年2月29日发布,带有参数类型的特性。这允许模块的作者写出像Perl内部命令那样智能的子程序。Perl 5.003于1996年6月25日作为一个安全更新的版本发布。

Perl 5历史中最重要的事件之一是支持了模块。在1995年10月26日,CPAN,一个软件仓库,创建了;截至2012年4月,它已经有超过9500个作者写的24500多个模块了[7]

Perl 5.004于1997年5月15日发布,添加了UNIVERSAL包,这给了Perl一个所有的类的基础和要求使用模块的特定版本的能力。另一个重要的开发是包括了CGI.pm模块[8],有助于Perl发展为一个CGI脚本语言[9]

Perl现在也支持在Microsoft Windows和其它一些操作系统下运作[8]

Perl 5.005于1998年7月22日发布。这个版本包括了一个更好的正则引擎,一个编译系统(通过B::*模块),qr//正则引用操作符,一个基础模块的选集,并且又支持了一些其它的操作系统,包括BeOS[10]

[编辑]2000年至今

Perl 5.6于2000年3月22日发布。大的修改包括64位支持,Unicode字符串支持,大文件支持(即:超过2GiB的文件)以及“our”关键字[11][12]。在开发Perl 5.6的时候,开发组决定把版本名称作成类似其它开源项目的;在5.005_63版之后,下一个版本变成了5.5.640,计划是开发版本用奇数,稳定版本用偶数。

2000年时,拉里·沃尔询问社区对Perl新版本的建议。这个进程的结果在361 RFC(评论请求)文件里(这个文件可以指导Perl 6的开发)。2001年[13],工作开始于设计Perl 6,一系列的文件概述了新一代Perl里的改变和设计。它们是作为一期RFC被展示的,而不是一个正式文档。这时,Perl 6的存在还只是一门语言的概述。

Perl 5.8最初于2002年7月18日发布,从此,每年才有一次更新。Perl 5.8的最后一版是5.8.9,发布于2008年12月14日。Perl 5.8改进了Unicode支持,添加了一个新的IO处理机制和新的多线程处理,提高了数字精度,添加了一些新模块[14]

2004年,工作开始于提要——原来的建议文件,但后来变成了Perl 6语言的详述。2005年2月,唐凤,开始开发Pugs,一个用Haskell写的Perl 6直译器[15]。这是最初的一个Perl 6实现。这个努力停止于2006年[16]

2007年12月18日,Perl 1.0的20周年纪念日,Perl 5.10.0发布了。Perl 5.10.0包括了显著的新特性,这拉近了Perl 5和6之间的距离。这些特性包括一个swtich语句(叫做 “given/when”),正则表达式的更新和智能匹配操作符“~~”[17][18]。同时,另一个Perl 6的实现,Rakudo Perl的开发开始了,一起使用Parrot虚拟机开发。从2009年11月开始,Rakudo Perl已经是每月一更新,现在已经是Perl 6的最完整的一个实现了。

Perl 5开发过程中的一次大修改在Perl 5.11;开发社区使用了每月更新的形式,这样就可以提前预知3个月以内的发布日期。

2010年4月12日,Perl 5.12.0发布了。显著的提升包括新的package NAME VERSION语法,Yada Yada操作符(有意地用占位符标记没有实现的代码),默认use strict;(在use 5.012;时)完整的Y2038编译,正则转化重载,DTrace支持,和Unicode5.2[19]。Perl 5.12.3于2011年1月21日发布;它包括了新版的模块和一些文档的改变[20]。 版本5.12.4于2011年6月20日发布。

Perl 5.14发布于2011年5月14日。这个分支的最后一版,5.14.2,发布于2011年9月26日。

Perl 5.16发布于2012年5月20日。显著的新特性包括可以指定一个perl的版本来模拟,这允许用户更新perl的版本,但可以运行可能会不兼容的老脚本[21]。Perl 5.16也更新了核心部分来支持Unicode?6.1[21]

[编辑]名称

Perl原名叫“Pearl”。拉里·沃尔想给这个语言起一个有正面意思的短的名字;他考虑了(并且否定了)字典里每一个3—4个字母的词。他也考虑用他的妻子Gloria的名字命名。沃尔在Perl官方发布之前发现了现有的PEARL语言,并且改变了这个名字[22]

当指代这个语言的时候,名字通常是大写的(Perl),就像专有名词一样。当指代这个直译器本身的时候,这个名字通常是小写的(perl),因为大部分类Unix文件系统都是区分大小写的。在《Programming Perl》的第一版发布之前,用perl指代这个语言也很普遍;Randal L. Schwartz排版时将这个语言的名字在书中写成大写的以便理解。后来,这个大小写的区别就成为正规的了[23]

全大写的“PERL”是有争议的,而文档中说明“PERL”是不对的[23],一些核心的社区成员将其视为外行的标志[24]。这个名字偶尔会被视为“Practical Extraction and Report Language”的缩写,就像文档[22]顶端和一些纸质书本说的那样[25]。一些全称被建议作为正式名称,包括沃尔自己的幽默的“Pathologically Eclectic Rubbish Lister”[26]。的确,沃尔要求这个名字启示许多不同的扩展[27]

[编辑]骆驼标志

骆驼标志

Programming Perl》,由奥莱理媒体发布,特色是封面有一张骆驼的图片,因而被称作“骆驼书”[28]。这张骆驼的图片已经成为了Perl非官方的标志和一个黑客的标志,这出现在T恤衫和其它衣服上。

欧莱礼拥有此图像之商标,并且宣称,唯有在捍卫“符号之完整性”时,才会行使其法律上的权力[29]。欧莱礼允许此商标在非商业目的之前提下被使用,并同时供了Programming Republic of Perl的图像以及Powered by Perl的按钮图。[30]Perl的另一个识别符号是羊驼。因为《Intermediate Perl》一书的封面是一只羊驼[31]

[编辑]洋葱标志

洋葱标志

Perl基金会拥有一个可选的标志,一个洋葱,允许它的子站点,Perl Mongers,PerlMonks,Perl.org和其它网站使用[32]

[编辑]Perl简介

[编辑]Perl语言的中心思想

Perl语言的中心思想可以集成为一句话“TMTOWTDI”:

There's More Than One Way To Do It.
(不只一种方法来做一件事。)

Perl的作者拉里·沃尔建议可以把这个缩写词念成“Tim Toady”。这句话后来被扩充成:

There's more than one way to do it,but sometimes consistency is not a bad thing either.
(不只一种方法来做一件事,但有时保持一致也不错。)
  • TIMTOWTDIBSCINABTE,发音为“Tim Toady Bicarbonate”[33].

另一个Perl程序员常常想起的Perl俗语是:

Easy things should be easy,and hard things should be possible.
(简单的事情应该是简单的,复杂的事情应该变得可能。)

[编辑]优点

为了实现这样的目标,并且又因为Larry Wall本人也是一个语言学家,他设计Perl语言时使用了很多语言学的思维。相比C、Pascal这样的“高级”语言而言,Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素。Perl具有动态语言的强大灵活的特性,并且还从C/C++、Basic、Pascal等语言中分别借鉴了语法规则,从而提供了许多冗余语法。使得程序员可以忽略计算机内部数据存储、类型、处理方法、运算规则、甚至内存越界等等的细节,而将思考中心放在所需要的程序逻辑上。就这一点而言,很多Perl程序员认为目前只有Perl、Python等泛型语言才能称为“高级”语言,而C、Pascal甚至C++这些只能称为“中高级”语言而已。可以说,在统一变量类型和掩盖运算细节方面,Perl做得比Python更为出色。

由于从其他语言大量借鉴了语法,使得从其他编程语言转到Perl语言的程序员可以迅速上手写程序并完成任务,这使得Perl语言是一门容易用的语言。

[编辑]缺点

也正是因为Perl的灵活性和“过度”的冗余语法,也因此获得了仅写(write-only)的“美誉”,因为Perl程序可以写得很随意(例如,变量不经声明就可以直接使用),但是可能少写一些字母就会得到意想不到的结果(而不报错),许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍,这就令程序的维护者(甚至是编写者)难以维护。

同样的,因为Perl这样随意的特点,可能会导致一些Perl程序员遗忘语法,以至于不得不经常查看Perl手册。对此,《Learning Perl》一书里建议经常使用Perl编程。

建议的解决方法是在程序里使用use strict;以及use warnings;,并统一代码风格,使用库,而不是自己使用“硬编码”。Perl同样可以将代码书写得像Python或Ruby等语言一样优雅。

[编辑]Perl的语法

[编辑]Perl的Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言的第一个示例:


#!/usr/bin/env perl
print "Hello,world!n";

如果有perl 5.10以上的版本,也可以这样:

#!/usr/bin/env perl use 5.010; say 这个程序将输出一行字符串:“Hello,world!”,以及一个换行。

[编辑]变量

Perl是一种无类型语言(untyped),换句话说,在语言层面上,Perl和大多数编程语言不同,不把变量分成整数、字符、浮点数等等,而只有一种能接受各种类型数据的“无类型”变量。Perl的变量以$字符开头。例如$a=5;$b="Hello";$c=3.2;$d='n这里并不换行'都是合法的Perl语句。

Perl中各种变量的运算也很自由,数和含有数的字符串是等效的,可以把数字字符串参与数学计算,也可以反之,让数字参与字符串的构成和操作。

除单个变量(Perl称为标量“Scalar”)之外,Perl还有两种集合类型,分别是数组(Array,用@字符开头)和关联数组(Associative array,或者称为Hash,用%开头。类似C++0x的STL?无序表“unordered_map”和Python的字典“Dictionary”)。数组可以内含任意可变数目的变量,并以其存储顺序作为索引以完成常数时间的定位;而Hash表,则可以在变量之间创建一一映射,就像字典一样,把不同的变量按照他们的逻辑关系组织起来,并以作为“键”的变量进行索引,完成常数时间的定位。

另外,Perl还有一种特殊的类型,引用(reference),类似于指针,当作标量处理,可以指向标量(含引用)、数组、Hash等任何类型。如:

$foo = $bar; print $$foo; @bar@$foo?r%$foo&;bar$foo->()&$foo 引用的好处在于,将它传递给函数之后,函数可以修改它指向的变量。而如果传递普通变量,修改的值只在函数内有效。

sub foo { my $var shift; $$var = '1'} '2'; $foo$$var; foo $var 输出“21”,即foo()内改变了$foo。

[编辑]判断语句

因为Perl大量的创造冗余的语法,并且从其他语言中大量的借鉴语法,使得Perl的语法极其丰富和灵活。Perl共有下列几种判断语句:

  • if区块
if $hour > 22) { "should sleep...}
    if语句
"hello" $guest >= 1;
    unless区块
unless $credit 100"You can not graduate!unless语句
"eatn" $food == 0given/when(语句及区块)
use ; given $foo) { say 'a' when 'a'; when /b/{ say 'b'} #when可以写成语句或区块 default 'not match'#只可以写成区块。 }

由于逻辑运算对象的作用,还可以写出不用关键字ifunless的判断语句,如常用的打开文件语句:

open DATA, '<'$filename or die "Can't open $filename: $!;

[编辑]循环语句

Perl中的循环语句也是非常的丰富。主要有:

Perl自己的for或者foreach循环(两个完全一样):

@group = 1 .. 10for @group"$_} @groupforeach 从C语言借鉴来的for循环(又可写作foreach,两个完全一样):

$i <</span> $i++"$group[$i]}

while循环:

=while 10++; do...while循环:

do } ;

until循环:

until 从PASCAL语言借鉴来的do...until循环:

甚至还有利用动态语言特性,用map函数也可以做循环:

map { n" } 其实还有其他的循环方式。总而言之,就是TMTOWTDI。

[编辑]函数

Perl提供了可以直接调用的、数目众多的函数。可以对以下对象进行操作:

  • 数组:chomp,join,keys,map,pop,push,reverse,shift,sort,splice,split,unshift,values
  • 数据库:dbmclose,dbmopen
  • 目录:chdir,closedir,mkdir,opendir,readdir,rewinddir,rmdir,seekdir,telldir
  • 文件:binmode,chdir,chmod,chown,chroot,close,eof,fnctl,fileno,flock,getc,glob,ioctl,link,lstat,open,print,printf,read,readlink,rename,seek,select,stat,symlink,sysopen,sysread,syswrite,tell,truncate,umask,unlink,utime,write
  • 组:endgrent,getgrent,getgrgid,getgrname,getpgrp,setgrent,setpgrp
  • Hash: delete,each,exists,values
  • 主机:endhostent,gethostbyaddr,gethostbyname,sethostent
  • 输入:getc,sysread
  • 处理器间通讯:msgctl,msgget,msgrcv,msgsnd,pipe,semctl,semget,semop,shmctl,shmget,hmread,shmwrite
  • 数学:abs,atan2,cos,exp,hex,int,log,oct,rand,sin,sqrt,srand
  • 消息队列:msgctl,msgsnd
  • 其他:bless,defined,do,eval,formline,import,ref,scalar,syscall,tie,tied,undef,untie,wantarray
  • 网络:endnetent,getnetbyaddr,getnetbyname,getnetent,setnetent
  • 输出:die,warn,write
  • 口令:endpwent,getpwent,getpwname,getpwuid,setpwent
  • 进程:alarm,die,dump,exec,exit,fork,getlogin,getppid,getpriority,kill,setpriority,sleep,system,times,wait,waitpid
  • 协议:endprotent,getprotobyname,getprotobynumber,getprotoent,getservbyname,getservbyport,getservent,setprotoent
  • 正则表达式:grep,pos,quotemeta,reset,study
  • 范围:caller,local,my
  • 服务:endservent,setservent
  • 套接字:accept,bind,connect,gethostent,getpeername,getsockname,getsockopt,listen,recv,send,setsockopt,shutdown,socket,socketpair
  • 字符串:chop,chr,crypt,index,lc,lcfirst,length,Ord,pack,q,qq,qw,qx,rindex,sprintf,substr,uc,ucfirst,unpack,vec
  • 时间:gmtime,localtime,time
  • UNIX: chmod,endgrent,endhostent,endnetent,endprotent,endpwent,endservent,sethostent,setnetent,setpgrp,setprotoent,setpwent,setservent,waitpid

perlfunc(1)里可以按字母序查找Perl函数用法。

[编辑]Perl的应用

Perl主要应用在Unix平台和网页中(PHP,CGI)。Perl拥有海量的模块支持,在解决问题时非常方便。CPAN有很多Perl模块。

[编辑]Perl Data Language

Perl Data Language(简称PDL)是Perl的一个外接模块,也是对Perl功能的一个重要拓展。它使得Perl语言可以直接对2至多维的矩阵直接操作,进行快速的矩阵运算,完成基础的Perl所不能完成的运算,大大拓展了Perl的适用范围。所以PDL本身也是很多其他模块的基础。

而且PDL提供了与很多其他软件包的接口,例如FFTW(一个快速傅立叶变换的软件包),又或者是Mesa(Linux上的OpenGL三维图形渲染包),这些包原来往往仅提供C/C++语言接口。这一功能使PDL成为拓展Perl功能的一个中间层。

[编辑]Perl诗经

和C语言一样,在Perl界,难以读懂的代码大赛是个有名的活动。近似难以读懂的代码,但方向不同,Perl Poetry是可以被perl编译的诗。新的诗经通常会在Perl Monks网站发表。

另一个Perl黑客的有趣活动是写JAPHs。

[编辑]以Perl编写的软件

  • stow
  • TWiki
  • Frozen Bubble[34]

[编辑]竞争对手

因为许多Perl程序的代码难以阅读,加上它的面向对象功能被视为不是真正的面向对象(只是模块的模拟),于是很多人拿Perl和其他动态语言来比较。

最常见的比较对象是Python,有人写了篇文章叫What's wrong with Perl,指出Perl的缺点,鼓励别人学Python。著名黑客埃里克·斯蒂芬·雷蒙写Why Python?,该文中一个重要的比较对象就是Perl。A Byte Of Python里的Why Not Perl??也把Python和Perl比较。

Ruby的作者(松本行弘,Matz)甚至直认他想Ruby作为Perl的后继者。[35]

[编辑]Perl 6

Camelia,Perl 6项目的标志 [36]
主条目: Perl 6

Perl 6正在开发中,它将会与现在的Perl版本有很大不同,但相信还要开发一段长时间。 其中最主要的改变是,Perl 6会是完全面向对象的,有专用于声明类型的语法:

class Foo is Universal { # inherit form Universal has $member_variable method member_function { "some string" 而且可以给变量定义类型,当类型不匹配时,就会报错[37]

另外,Perl 6提供了不同的正则语法,新的语法称作“规则”,并且允许用户在正则中加入空格等以便阅读,也可以命名一个正则方便调用[38]

Perl 6中的控制流程和循环的判断条件的括号是可选的,如:

$percent 100 "weird mathematics"for ..3 { # using $_ as loop variable say 2 * $_3 -> $x # with explicit loop variable say $x$stuff.is_wrong .try_to_make_right}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读