Perl学习资料

Perl学习资料,第1张

概述网站: https://www.perl.org/ http://zh.wikipedia.org/zh/Perl 书籍:《learning perl》 http://learn.perl.org/ http://www.perl6.org/ http://www.perl6.org/archive/ 简介: Perl是高階、通用、直譯式、動態的程式语言。最初设计者拉里·沃尔(Larry Wall

网站:

https://www.perl.org/

http://zh.wikipedia.org/zh/Perl


书籍:《learning perl》

http://learn.perl.org/

http://www.perl6.org/

http://www.perl6.org/archive/



简介:

Perl是高階、通用、直譯式、動態的程式语言。最初设计者拉里·沃尔(Larry Wall)為了讓在UNIX上進行報表處理的工作變得更方便,決定開發一個通用的腳本語言,而在1987年12月18日發表。目前,版本中包含Perl 5以及Perl 6(开发中)。

Perl借用了C、sed、awk、shell脚本以及很多其他程式語言的特性。其中最重要的特性是Perl内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。

2000年开始,目前拉里·沃尔开始開發Perl 6,來作為Perl的後繼;不過,Perl 6語言的語法有很多轉變,所以Perl 6被視為Perl家族中的另一個語言。[2]

Perl语言的应用范围很广,除CGI以外,Perl被用于图形编程、系统管理、网络编程、金融、生物以及其他领域。由于其灵活性,Perl被称为脚本语言中的瑞士军刀。


骆驼标志[编辑]

骆驼标志

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

歐萊禮擁有此圖像之商標,並且宣稱,唯有在捍衛「符號之完整性」時,才會行使其法律上的權力[29]。歐萊禮允許此商標在非商業目的之前提下被使用,並同時供了Programming Republic of Perl的圖像以及Powered by Perl的按鈕圖。[30]Perl的另一個識別符號是羊驼。因为《Intermediate Perl》一书的封面是一只羊驼[31]

洋葱标志[]

@L_404_29@ 洋葱标志

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等泛型语言才能称为“高级”语言,而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 perlprint "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\%bar%$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" if $guest >= 1; unless区块 unless $credit 100"You can not graduate!unless语句 "eat\n" unless $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"$_}for @groupforeach 从C语言借鉴来的for循环(又可写作foreach,两个完全一样):

$i
; < $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 { say "weird mathematics"for ..3 { # using $_ as loop variable say 2 * $_3 -> $x # with explicit loop variable say * $xwhile $stuff.is_wrong { .try_to_make_right 但是如果加入括號,不能緊跟在關鍵字後邊,而要空一格,因為像foo()這樣的形式,會調用函數,而不管它是不是關鍵字[39]

#正確
say 'should sleep...'if#錯誤 say } 总结

以上是内存溢出为你收集整理的Perl学习资料全部内容,希望文章能够帮你解决Perl学习资料所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1275853.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存