Perl

维基百科,自由的百科全书

跳转到: 导航, 搜索

跳过字词转换说明

Perl
多重编程范式
发行时间
1987年
設計者
拉里·沃尔
最新发行时间 5.10.0 (2007年12月18日)
Dynamic
啟發語言
AWK, BASIC, BASIC-PLUS, C語言, C++, LISP, Pascal, sed, Unix shell
影響語言
Python, PHP, Ruby, ECMAScript
跨平台
GNU通用公共许可证, Artistic License
http://www.perl.org

Perl是一种脚本语言。最初的设计者为拉里·沃尔(Larry Wall),它於1987年12月18日發表。Perl借取了Csedawk、shell scripting以及很多其他程式語言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN

目录

[编辑] Perl简介

Perl原名pearl,但是在這個語言官方發表前,拉里·沃尔發現已經有個程式語言“pearl”,便將這個程式語言的名字改成Perl。对于Perl这四个字母,有一些解釋,包括充滿幽默感的“Pathologically Eclectic Rubbish Lister”。“Practical Extraction and Report Language”曾經出現在很多有關Perl的資料裏,包括官方的首頁。不过事实上这个长名字是后来凑出来的。它的名字第一個字母大写(Perl)時就指這個程式語言,無大写字母(perl)時就指它的直譯器。將Perl寫成“PERL”是不適當的,因為它並非一個縮寫字。

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

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

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

Perl的作者Larry Wall建议可以把这个缩写词念成「Tim Toady」。

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

Easy things should be easy, and hard things should be possible.

[编辑] Perl的駱駝圖案

Perl駱駝歐萊禮媒體O'Reilly Media)設計給Perl程式語言的圖標。牠也是一種駭客的象徵,出現在某些T-shirt和其他衣服標籤上。

歐萊禮擁有此圖像之商標,並且宣稱,唯有在捍衛「符號之完整性」時,才會行使其法律上的權力。[1]歐萊禮允許此商標在非商業目的之前提下被使用,並同時供了Programming Republic of Perl的圖像以及Powered by Perl的按鈕圖。[2]然而,駱駝其實從未被考慮成為Perl的官方識別符號,真要說有的話,其識別符號其實是洋蔥。[3]

[编辑] 优点

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

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

[编辑] 缺点

也正是因为Perl的灵活性和“过度”的冗余语法,也因此获得了write-only的“美誉”,因为许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍。 但Perl同样可以将代码书写得像PythonRuby等语言一样优雅。

[编辑] Perl的语法

[编辑] Perl的Hello World程式

下面是一个在標準輸出設備上輸出Hello World的簡單程式,這種程式通常作為開始學習程式語言的第一個範例:

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

这个程序将输出一行字符串:“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++STL map和Python的Dictionary)。数组可以内含任意可变数目的变量。而Hash表,则可以在变量之间建立一一映射,就像字典一样,可以把不同的变量按照他们的逻辑关系组织起来。

[编辑] 判断语句

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

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

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

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

[编辑] 循环语句

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

Perl自己的for或者foreach循环:

@group = 1 .. 10;
for (@group) {
    print "$_\n";
}
 
foreach (@group) {
    print "$_\n";
}

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

for ($i = 0; $i < 10; $i++) {
    print "$group[$i]\n";
}

while循环:

$i=0;
while ($i < 10) {
    print "$group[$i]\n";
    $i++;
}

do...while循环:

$i = 0;
do {
    print "$group[$i]\n";
    $i++;
} while ($i < 10);

until循环:

$i = 0;
until ($i == 10) {
    print "$group[$i]\n";
    $i++;
}

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

$i = 0;
do {
    print "$group[$i]\n";
    $i++;
} until ($i == 10);

甚至还有利用动态语言特性,用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, readdir, readlink, rename, rmdir, seek, select, stat, symlink, sysopen, sysread, syswrite, tell, truncate, umask, unlink, utime, write
  • 组:endgrent, getgrent, getgrgid, getgrname, getpgrp, setgrent, setpgrp
  • Hash: delete, each, exists, keys, values
  • 主机:endhostent, gethostbyaddr, gethostbyname, sethostent
  • 输入:getc, read, 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, msgget, msgrcv, msgsnd
  • 其他:bless, defined, do, eval, formline, import, ref, scalar, syscall, tie, tied, undef, untie, wantarray
  • 网络:endnetent, getnetbyaddr, getnetbyname, getnetent, setnetent
  • 输出:die, print, printf, syswrite, warn, write
  • 口令:endpwent, getpwent, getpwname, getpwuid, setpwent
  • 进程:alarm, die, dump, exec, exit, fork, getlogin, getpgrp, getppid, getpriority, kill, setpriority, sleep, system, times, umask, wait, waitpid
  • 协议:endprotent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, setprotoent
  • 正则表达式:grep, pos, quotemeta, reset, split, study
  • 范围:caller, local, my
  • 服务:endservent, getservbyname, getservbyport, getservent, setservent
  • 套节字:accept, bind, connect, gethostbyaddr, gethostbyname, gethostent, getpeername, getservbyname, getservbyport, getservent, getsockname, getsockopt, listen, recv, select, send, setsockopt, shutdown, socket, socketpair
  • 字符串:chop, chr, crypt, hex, index, join, lc, lcfirst, length, oct, Ord, pack, q, qq, quotemeta, qw, qx, reverse, rindex, split, sprintf, substr, uc, ucfirst, unpack, vec
  • 时间:gmtime, localtime, time
  • UNIX: chmod, chown, chroot, dump, endgrent, endhostent, endnetent, endprotent, endpwent, endservent, fnctl, fork, getgrent, getgrgid, getgrname, gethostent, getlogin, getnetent, getpgrp, getppid, getpriority, getprotobyname, getprotobynumber, getprotoent, getpwent, getpwname, getpwuid, getservbyname, getservbyport, getservent, ioctl, link, lstat, readlink, select, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent, sleep, syscall, times, umask, wait, waitpid

这里可以按字母序查找Perl函数用法。

[编辑] Perl的应用

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

[编辑] Perl Data Language

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

而且PDL提供了与很多其他软件包的接口,例如FFTW(一个快速傅立叶变换的软件包),又或者是MesaLinux上的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。

Ruby的作者(松本行弘,Matz)甚至直認他想Ruby作為Perl的後繼者。[4]

[编辑] Perl的歷史

  • 1987/10/18發表Perl 1.0
  • 1994年發表Perl 5始具有OOP的作法
  • 5.8.0版開始,Perl具備了Unicode萬國碼)支援
    • 將Big5編碼的檔案轉成Unicode,祗需鍵入下列指令:
perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8
    • Perl也內附了``piconv,一支完全以Perl寫成的字碼轉換工具程式,用法如下:
piconv -f big5 -t utf8 < file.big5 > file.utf8
piconv -f utf8 -t big5 < file.utf8 > file.big5

[编辑] Perl 6

Perl 6正在开发中,它将会与现在的Perl版本有很大不同,但相信還要開發一段長時間。 其中最主要的改變是,Perl 6會是完全物件導向的,有專用於宣告類別的語法

class Foo is Universal { # inherit form Universal
    has $member_variable
 
    method member_function {
        print "some string";
    }
}

[编辑] 注释

  1. ^ O'Reilly—The Perl Camel Usage and Trademark Information
  2. ^ Index of /images/perl
  3. ^ Perl Trademark, User Logos, Perl Marks and more
  4. ^ 「我認為Ruby這個名字作為Perl之後的一門語言的名字真是再恰當不過了。」--摘錄自O'Reilly訪問Matz。

[编辑] 參見

[编辑] 外部链接

[编辑] 中文資源、社群



Original-Page: Perl - 维基百科,自由的百科全书
 Web-Blaster V2.21 Close Webblaster Floater
The page now displayed was connected to the database of the Assoziations-Blaster (Deutsche Version) through filtering it with the Web-Blaster.

The whole process takes place in real time and no data from other servers is saved anywhere.

In order to see this page without the filter and loaded from its original server, the Webblaster must be turned off.

Turn Off Webblaster