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

Perl概述

发布时间:2020-12-16 00:27:43 所属栏目:大数据 来源:网络整理
导读:Perl的骆驼图案 Perl骆驼 是欧莱礼媒体(O'Reilly Media)设计给 Perl 编程语言的图标。它也是一种黑客的象征,出现在某些T-shirt和其他衣服标签上。 欧莱礼拥有此图像之商标,并且宣称,唯有在捍卫“符号之完整性”时,才会行使其法律上的权力。 [2] 欧莱礼

Perl的骆驼图案

Perl骆驼是欧莱礼媒体(O'Reilly Media)设计给Perl编程语言的图标。它也是一种黑客的象征,出现在某些T-shirt和其他衣服标签上。

欧莱礼拥有此图像之商标,并且宣称,唯有在捍卫“符号之完整性”时,才会行使其法律上的权力。[2]欧莱礼允许此商标在非商业目的之前提下被使用,并同时供了Programming Republic of Perl的图像以及Powered by Perl的按钮图。[3]然而,骆驼其实从未被考虑成为Perl的官方识别符号,真要说有的话,其识别符号其实是羊驼。[4]


优点

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

由于从其他语言大量借鉴了语法,使得从其他编程语言转到Perl语言的程序员可以迅速上手写程序并完成任务,这使得Perl语言是一门容易用的语言。但问题是这样写出来的“类xx语言”的Perl程序对不熟悉这种语言的程序员却如同天书,这使得Perl语言易写不易读。


缺点

也正是因为Perl的灵活性和“过度”的冗余语法,也因此获得了write-only的“美誉”,因为许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍。 但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的STLunordered_map和Python的Dictionary)。数组可以内含任意可变数目的变量,并以其存储顺序作为索引以完成常数时间的定位;而Hash表,则可以在变量之间建立一一映射,就像字典一样,把不同的变量按照他们的逻辑关系组织起来,并以作为“键”的变量进行索引,完成常数时间的定位。


判断语句

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

  • if模块
if ($hour > 22) {
    "should sleep...;
}
  • if语句
"hello" if $guest >= 1;
  • unless模块
unless $credit 100"You can not graduate!unless语句
"eatn" unless $food == 0;

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

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


循环语句

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

Perl自己的for或者foreach循环:

@group = 1 .. 10;
for @group"$_}
 
foreach }

从C语言借鉴来的for循环:

$i ; < $i++"$group[$i]}

while循环:

=while 10; ++; }

do...while循环:

do } );

until循环:

until }

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

;

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

print map { n" } @group;

其实还有其他的循环方式。总而言之,就是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

这里可以按字母序查找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 hackers的有趣活动是写JAPHs。


竞争对手

因为许多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的后继者。[5]

(编辑:李大同)

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

    推荐文章
      热点阅读