Perl


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
網站: www.Perl.org

Perl是一種腳本語言。 最初的設計者為拉里·沃爾(Larry Wall),它於1987年12月18日發表。Perl借取了C、sed、awk、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和其他衣服標籤上。

優點

為了實現這樣的目標,並且又因為 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 是一種 泛型語言,換句話說,在語言層面上,Perl 和大多數程式語言不同,不把變數分成整數字元浮點數等等,而只有一種能接受各種類型數據的「泛型」變數。Perl的變數以$字元開頭。例如$a=5;$b="Hello";$c=3.2;都是合法的 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, shmread, 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平台和網頁中(PHP,CGI)。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的後繼者。[1]

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
  • 2003年發表了Perl 6

Perl 6

Perl 6正在開發中,它將會與現在的Perl版本有很大不同,但相信還要開發一段長時間。

註釋

  1. ^ 「我認為 Ruby 這個名字作為 Perl 之後的一門語言的名字真是再恰當不過了。」--摘錄自O'Reilly 訪問 Matz。

參見

外部連結

中文

fuck

! __







Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History