国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Perl 5.6 的新特性在哪些方面優(yōu)于 C/C++/Java ?
Cultured Perl: 吸引 C 和 Java 程序員目光的 Perl 5.6
 Perl 5.6 的新特性在哪些方面優(yōu)于 C/C++/Java ?
http://blog.csdn.net/haiskey/archive/2002/11/20/17168.aspx

Teodor Zlatanov
Programmer, Northern Light, Inc.
January 2001

筆者側(cè)重于闡述 Perl 與 C 或 Java 不同的獨(dú)特之處。您一定會(huì)為 Perl 這些在其他語(yǔ)言中看不到的特性而心花怒放:操作符的容錯(cuò)能力、一項(xiàng)任務(wù)多種實(shí)現(xiàn)、標(biāo)點(diǎn)、正則表達(dá)式以及變量機(jī)制等。所有這些都賦予您的手指更靈活的魔力。在某些方面 Perl 的確能給 C 和 Java 程序員很多有用幫助,可惜目前它還遠(yuǎn)達(dá)不到眾所周知的程度。因此,抓緊機(jī)會(huì)提高您的 Perl 水平吧!

Perl 有時(shí)甚至令有經(jīng)驗(yàn)的程序員也覺得頭疼,因?yàn)樗麄儼l(fā)現(xiàn)一不小心就會(huì)寫出模棱兩可的語(yǔ)句。但這種在結(jié)構(gòu)、特性體系方面的模糊性從另一方面顯示了 Perl 語(yǔ)言強(qiáng)大的能力。畢竟 Perl 語(yǔ)言最開始的設(shè)計(jì)初衷就是希望能用多種方式來(lái)達(dá)到同一目的。

這里我們將要探討 Perl 5.6 中那些最容易混淆的特性,并將它們與 C/C++/Java 中相應(yīng)的特性做比較。主要圍繞 "Natural Language Principles in Perl" 中的原則展開(Larry Wall 著,參看本文末尾的 資料 部分),因?yàn)樗鼈兪?Perl 最能與 C、C++ 和 Java 語(yǔ)言區(qū)分開的地方。此外,關(guān)于 Perl 語(yǔ)法的結(jié)構(gòu)可以在 "perldoc perlsyn" 參考文檔中找到,另一本值得推薦的 Perl 指南讀物則是 Programming Perl

Perl 解釋器
初學(xué)者馬上就會(huì)發(fā)現(xiàn) Perl 中似乎沒有任何編譯器。事實(shí)上,Perl 腳本大多是由 Perl 解釋器直接運(yùn)行的,例如 UNIX 系統(tǒng)下的 "Perl"、DOS/Windows 下的 "perl.exe" 就是 Perl 解釋器。而在 MacOS 中則不需要這些解釋器。您可以試試看如何運(yùn)行 Perl 腳本。首先在您的操作系統(tǒng)上啟動(dòng)相應(yīng)的 Perl 解釋器,或是在 MacOS 系統(tǒng)中直接運(yùn)行。在大多數(shù)系統(tǒng)中,文件尾標(biāo)志(UNIX 系統(tǒng)中為 Control-D)用來(lái)表示用戶輸入結(jié)束。因此在 UNIX 系統(tǒng)中,下面這個(gè)腳本將能得到 "5+6" 的計(jì)算結(jié)果:

從最簡(jiǎn)單的 Perl 程序入手

> perl(Perl is waiting for user input here, because no script name is given)print 5+6You press Control-D here11  


可以看到 Perl 解釋器運(yùn)行了這個(gè)只有一行的腳本程序,并輸入該表達(dá)式的計(jì)算結(jié)果 11。

Perl 解釋器有許多選項(xiàng)。例如,-e 選項(xiàng)表示將命令行的輸入作為腳本文件來(lái)執(zhí)行,因此上面的腳本例子也可以這樣實(shí)現(xiàn):在命令行輸入 perl -e‘print 5+6‘(注意,要用單引號(hào)將命令括起來(lái))。而 -i 選項(xiàng)則類似于通過一個(gè)過濾器,允許在文件中不同的位置進(jìn)行編輯。-n 和 -p 選項(xiàng)能讓程序員打開或關(guān)閉輸出。-w 選項(xiàng)與 C/C++ 中的 "-Wall" 編譯選項(xiàng)類似,都能夠?qū)Τ绦蛑袧撛趩栴}給出警告信息,但與 -Wall 不同的是,-w 功能在程序運(yùn)行時(shí)也是被激活的。

速度和 Benchmark
人們常常拿 Perl 與 C/C++ 比較,并抱怨 Perl 運(yùn)行速度不夠快。某些時(shí)候這的確是事實(shí),但是并非永遠(yuǎn)如此。我建議您在認(rèn)為 C 或 C++ 更快之前,使用 Benchmark 模塊試試看 (perldoc Benchmark)。此外,Perl 能很方便地與 C/C++ 代碼或庫(kù)連接,且某些 Perl 內(nèi)置函數(shù)并不比 C 代碼慢,如排序或打印等。這里再次提醒您在堅(jiān)信 C/C++ 比較快之前,先使用一下 Benchmark 模塊。

要記住,過早的優(yōu)化往往是錯(cuò)誤的根源。如果您在 Perl 中寫了一個(gè)原型,并用其他語(yǔ)言來(lái)重寫是沒有問題的。原型意味著能夠方便地開發(fā)。

與 Java 相比而言,Perl 也能夠很好地工作。Perl 不象 Java 那樣擅長(zhǎng)于線程,但它的 Tk GUI 界面工具箱卻比 Java 的 Swing GUI 庫(kù)要好。并且 Java 代碼總是能夠連接到 Perl 程序中,反之亦然。因此,有時(shí)您可以通過某種程度上的結(jié)合,使得程序在兩方面都做得很好。

異常、編譯和文檔
Perl 通過 CPAN 中的模塊或是其內(nèi)置函數(shù) eval() 來(lái)拋出異常。就好像在 C++ 或 Java 中通過 try/catch 代碼塊來(lái)處理異常一樣,eval 函數(shù)能處理某個(gè)代碼段或某個(gè)字符串操作的異常。

事實(shí)上,Perl 程序在運(yùn)行之前還是需要編譯的,只是和 C/C++/Java 的編譯方式不相同。在設(shè)計(jì)和效果上,它和 Java 的字節(jié)解釋過程很相似。關(guān)于編譯的更詳盡內(nèi)容,可以參閱 "perldoc perlrun" 和 "perldoc perlcc" 文檔。

可用 POD 格式來(lái)將文檔嵌入 Perl 程序。這種文檔嵌入方式比 Javadoc 格式(僅適合于 API 文檔)要通用,但比不上 C/C++/Java 的注釋。

即使和 C、C++ 或 Java 比較起來(lái),Perl 程序也不算是一種結(jié)構(gòu)性強(qiáng)的語(yǔ)言。例如,BEGIN 語(yǔ)句塊會(huì)被首先執(zhí)行,但它可以在程序中多次說明。定義、變量和函數(shù)體可以在程序的任意位置出現(xiàn),Perl 所提供地強(qiáng)大功能可以最好地滿足這種隨意性。

由于這種松散結(jié)構(gòu)、嵌入的注釋、以及為追求方便而導(dǎo)致的令人混淆的語(yǔ)句,使得書寫 Perl 程序更像是在寫一封英文信件。

Perl 的容錯(cuò)能力
Perl 比 C/C++/Java 更能容忍一些模糊地寫法。例如可以用逗號(hào)來(lái)分隔語(yǔ)句或函數(shù)的參數(shù):

語(yǔ)句之間或函數(shù)參數(shù)之間的分隔符

print ‘Hello‘, ‘ ‘, ‘there.‘, "\n";     # print "Hello there\n"foreach (1..10){ my $i; $i = $_ * 2, print "$i\n";             # print evens from 2 to 20} 


Perl 能盡最大可能地消除這些語(yǔ)句可能引起的歧義。當(dāng)然,有些時(shí)候仍有無(wú)法解決的歧義(在這一點(diǎn)上,Perl 就象英語(yǔ)一樣)。

Perl 中另一個(gè)容易引起歧義的地方在于:變量經(jīng)常會(huì)被隱含使用。例如,"print" 語(yǔ)句缺省時(shí)會(huì)打印 $_ 變量的值。在其他一些含混的語(yǔ)句操作中,$_ 變量也是它們的缺省值,這就造成了一種混亂。例如:

隱含使用變量

$_ = "hello";s/hello/hi/;                            # $_ is "hi" nowprint;                                  # prints "hi"  


這里你可以看到,使用缺省變量能讓編程方便簡(jiǎn)潔。也就是說,Perl 和英語(yǔ)類似,通過某種模糊性來(lái)簡(jiǎn)化表達(dá)式。

一項(xiàng)任務(wù)多種實(shí)現(xiàn)
(There‘s more than one way to do it ,TMTOWTDI)

所有的語(yǔ)言在解決問題時(shí)都有自己的方法。在 C 里面,for() 循環(huán)是在一定范圍內(nèi)重復(fù)的最好方法;在 Java 里,靜態(tài)函數(shù)的調(diào)用是直接通過類而不是某個(gè)實(shí)例。

但對(duì)于同一件事情,Perl 至少有兩種解決方法。TMTOWTDI 原則就是 Perl 的座右銘,各種處理上的差異在 Perl 編程中是深受鼓勵(lì)的。

下面來(lái)看一個(gè)打印數(shù)組元素的例子。所有的表達(dá)方法都達(dá)到同一目的。

打印數(shù)組元素

print foreach @array;foreach (@array) {print};map {print} @array;print @array;  


要理解以上這些代碼的唯一途徑就是掌握所有 Perl 的語(yǔ)法。不要擔(dān)心哪種方法才是正確的,因?yàn)閷?shí)現(xiàn)同一目標(biāo)總是有多種正確的方法。考慮這些不同的表達(dá)方式,您可以更深刻體會(huì) Perl 的這個(gè)座右銘。

另外,雖然一個(gè)任務(wù)的實(shí)現(xiàn)有多種方法,但這并不意味著所有方法都是正確的。通常情況下,更有可能寫出的是一些錯(cuò)誤代碼。為了保證代碼的正確性,最好盡量使用那些 Perl 內(nèi)置的函數(shù),而較少使用自己所編寫的函數(shù),并且注意證明并記錄這些不那么顯然的方法。

正則表達(dá)式
如果沒有初始化,正則表達(dá)式很有可能造成一片混亂。大多數(shù)人都相信正則表達(dá)式是由 Kalahari bushmen 發(fā)明的,它滲透到了大學(xué)的計(jì)算機(jī)科學(xué)編程的所有方面。

Perl 的正則表達(dá)式是從 shell 腳本程序以及 awk/grep 工具中繼承而來(lái)的。但它的能力卻遠(yuǎn)遠(yuǎn)超出了原來(lái)的模型。

基礎(chǔ)的正則表達(dá)式是非常容易書寫的,但難以讀懂。例如 "con\w+" 和 "contra"、"contrary" 匹配,但與 "pro" 或 "con" 都不匹配。然而在 Perl 5.6.0 中,正則表達(dá)式被固化了。Unicode 字符集、模式內(nèi)任意代碼操作、flag toggles、條件表達(dá)式以及其他特征都被添加到正則表達(dá)式庫(kù)中。

對(duì)于初學(xué)者的一個(gè)最好的建議就是:首先學(xué)習(xí)最基本的正則表達(dá)式(參閱 資料 部分,或 "perldoc perlre" 參考手冊(cè)),稍后才進(jìn)一步學(xué)習(xí)那些復(fù)雜的高級(jí)特性。由于正則表達(dá)式必須全寫在一起,中間沒有辦法添加注釋,這就讓它們成為所有 Perl 代碼中最難讀懂的一部分。因此建議大家書寫已成型的代碼。

在 C/C++/Java 中正則表達(dá)式屬于外部的函數(shù)包,但 Perl 是目前最佳的正則表達(dá)式搜索和代換工具。在極少數(shù)情況下,它可能會(huì)比純 C 程序慢一些,但對(duì)于那些純粹面向正則表達(dá)式的問題,Perl 依然是您首選的工具。

標(biāo)量、數(shù)組和哈希散列
和 C、C++、Java 中變量不同的是,Perl 的變量的類型是由其名字決定的,并且會(huì)自動(dòng)初始化成相應(yīng)類型。這一點(diǎn)讓 Perl 初學(xué)者覺得很不習(xí)慣,但它非常地直觀而易于理解。

筆者推薦使用 "use strict"。通過它可以保證變量在使用之前聲明,從而避免打字錯(cuò)誤等引起的程序錯(cuò)誤。

如果沒有做到這一點(diǎn),則有可能遇到下面這樣的問題:

一個(gè)常見的打字錯(cuò)誤

$i = 5;print $j;                               # print $i 


此例子中,程序員本來(lái)要打印變量 i 的值,結(jié)果卻敲成了 j。Perl 并不會(huì)覺得這段代碼有什么問題,它會(huì)繼續(xù)執(zhí)行打印語(yǔ)句,顯示 $j 的值即什么都沒有。有些時(shí)候,Perl 的自動(dòng)生成對(duì)象的確很有用,但以我的經(jīng)驗(yàn)來(lái)說,最好還是用 "use strict" 來(lái)關(guān)掉這一自動(dòng)功能,從而避免上述問題。

Perl 變量可以是標(biāo)量 (scalars)、數(shù)組 (arrays)或哈希散列 (hashes,又叫做關(guān)聯(lián)數(shù)組)。(事實(shí)上,Perl 中有多種數(shù)據(jù)類型,但是程序員并不會(huì)直接面對(duì)它們。)此外也可以是引用,通常它們也是一種標(biāo)量類型。其中標(biāo)量名稱以 "$" 開頭,數(shù)組名以 "@" 開頭,而散列則以 "%" 開頭。

標(biāo)量是 Perl 中最簡(jiǎn)單的數(shù)據(jù)類型。每個(gè)標(biāo)量都有唯一的值,或者是字符串或者是引用。在必要的時(shí)候,字符串和數(shù)字可以互相轉(zhuǎn)化。這常讓初學(xué)者覺得欣喜異常。看一下這個(gè)例子:

標(biāo)量

$i = "hi there";print 1+$i;                             # prints 1


其中標(biāo)量 $i 的值是字符串 "hi there",它對(duì)應(yīng)的數(shù)值為 0。因此 1 + "hi there" 的值為 1,程序運(yùn)行結(jié)果為 1。

不過這并不意味著 Perl 解釋器在對(duì)某個(gè)標(biāo)量分別考慮其字符串類型和數(shù)字類型。事實(shí)上,在內(nèi)存中只是一個(gè)含有某個(gè)值的標(biāo)量。如果在數(shù)值運(yùn)算的語(yǔ)句中(如加法),這個(gè)標(biāo)量值就轉(zhuǎn)化成數(shù)值形式;如果在字符串操作語(yǔ)句中(例如打印),則以字符串形式執(zhí)行。但無(wú)論以什么形式運(yùn)算,該標(biāo)量變量實(shí)質(zhì)上只有一個(gè)值。

未定義的標(biāo)量的值為 "undef"。如果在 C/C++/Java 程序中,您可以將其他值與 null 比較,但在 Perl 中卻不能拿任何東西來(lái)與 "undef" 做比較??捎眠@樣使用 defined() 函數(shù):

Use of the ‘defined()‘ function

$i = "hi there";print $i if defined $i;                 # prints "hi there"undef $i;                               # set $i to be undefprint $i if defined $i;                 # prints nothing  


數(shù)組實(shí)質(zhì)上就是一組標(biāo)量。如果需要,數(shù)組大小可以自動(dòng)改變,有點(diǎn)象 Java 中的 Vector 類。C 和 C++ 中沒有與 Perl 數(shù)組類型相當(dāng)?shù)臇|西,但它們也有一些提供類似功能的庫(kù)(如 STL)。數(shù)組的一個(gè)有趣特性在于,數(shù)組的標(biāo)量數(shù)值等于它的元素個(gè)數(shù):

數(shù)組中的元素個(gè)數(shù)

@a = ("hi there", "nowhere");print scalar @a;                        # prints 2push @a, "hello";                       # add "hello" at the endprint scalar @a;                        # prints 3  


散列與數(shù)組類似,但里面的標(biāo)量并不是按照位置排序的,而是通過另一個(gè)標(biāo)量(必須是唯一值)來(lái)進(jìn)行索引。例如一個(gè)用 social security number 作索引的名字列表就是一個(gè)散列。將某個(gè)鍵值插入到散列后,該散列會(huì)自動(dòng)擴(kuò)展。散列與 Java 中的 HashMap 和 Hashtable 類很相似。

引用類型其實(shí)也是標(biāo)量,它們類似于 C 語(yǔ)言中的指針,能夠指向任何東西。這就允許 Perl 生成一個(gè)散列的數(shù)組、數(shù)組的散列、散列的散列、或是數(shù)組的數(shù)組(多維數(shù)組)。有多種方法來(lái)獲得引用所指向的內(nèi)容,或者直接使用引用的名字、或者使用 "->" 操作符。引用是一個(gè)涉及范圍非常廣的問題,可以參考 "perldoc perlref" 參考文檔來(lái)獲得更多相關(guān)信息。

C 和 C++ 只有一些固定類型的標(biāo)量。當(dāng)程序員要使用數(shù)組或哈希散列時(shí),不得不去使用鉤子 (hoop) 或是 STL 等外部庫(kù)。

Java 中有相當(dāng)于 Perl 里數(shù)組或散列功能的類庫(kù),但它們?cè)?Java 語(yǔ)言中并不是那么直接。比如說要對(duì)散列上所有元素做操作所需要的時(shí)間大約是 Perl 的三倍。

對(duì)散列中所有元素進(jìn)行操作的 Java 代碼

import java.util.Enumeration;import java.util.Hashtable;Hashtable hi = new Hashtable();// fill in hi‘s values// we can use an Iterator, still a lot of typingfor (Enumeration enum = hi.elements();     enum.hasMoreElements();){ Object o = enum.nextElement(); // do something with o}  


對(duì)散列中所有元素進(jìn)行操作的 Perl 代碼

# note that this even includes the definition and initialization of# the hash, and still is more compact than the Java code!%hash = { a => "hi", b => "hello" };foreach (values %hash){ # do something with $_} 


Perl 的缺憾
Perl 缺少 C、C++ 和 Java 中的許多特性,但它畢竟是一門完全不同的語(yǔ)言。這幾種語(yǔ)言中甚至有許多特性是互相矛盾的。例如 Java 只支持單一繼承,而 C++ 則可以有多個(gè)父類。這種有沖突的情況下當(dāng)然不可能繼承所有語(yǔ)言的特性,Perl 有它自己處理問題的方法。

由于 Perl 程序能夠被連接到 C 的庫(kù)中(事實(shí)上,這也就是 Perl 應(yīng)用廣泛的原因之一),這就使得幾乎沒有任何 C 或 C++ 能做而 Perl 不能的事情。

與 C 和 C++ 相比而言,Perl 有時(shí)欠缺的是運(yùn)行速度。這的確是一個(gè)問題,但是通過良好的編程算法以及 Perl 內(nèi)置函數(shù)的使用,就能夠克服這一缺點(diǎn)。

Perl 還不能直接使用 C 和 C++ 的庫(kù)。必須通過不同的模塊和綁定,才能夠?qū)⑦@些庫(kù)中的常量以及函數(shù)功能轉(zhuǎn)化成適應(yīng) Perl 的樣子。這就會(huì)導(dǎo)致開發(fā)和程序運(yùn)行的速度降低。但由于 CPAN 庫(kù)中發(fā)布了大量這些方面的模塊,因此這個(gè)問題并不是那么難以解決,

在訓(xùn)練編程技巧方面,Perl 并不象 C 和 C++ 那樣深入人心。它是一門年輕的語(yǔ)言,雖然很受歡迎,但并未被人們普遍接受。然而,大多數(shù)的 UNIX 系統(tǒng)上都安裝了 Perl,且其他的操作系統(tǒng)也都支持 Perl。

Perl 支持單一繼承或多繼承、封裝以及多態(tài),但這僅僅是通過外部模塊或程序員的協(xié)同來(lái)實(shí)現(xiàn)的。也就是說,Perl 語(yǔ)言本身并沒有嚴(yán)格的面向?qū)ο缶幊桃?guī)則,需要程序員自己來(lái)實(shí)現(xiàn)面向?qū)ο?。這一點(diǎn)有好也有壞,這就要取決于程序員或項(xiàng)目本身了。

Perl 的線程以及統(tǒng)一字符編碼(Unicode)支持遠(yuǎn)遠(yuǎn)落后于 Java,也稍微次于 C/C++。Java 從最開始設(shè)計(jì)就支持線程和 Unicode,而 C/C++ 則比 Perl 擁有更多的時(shí)間來(lái)調(diào)整這方面的正確支持。在 Perl 中,對(duì)線程和 Unicode 的支持仍處于起步階段,但 5.6.0 之后的穩(wěn)定版本發(fā)布之后這一點(diǎn)將得到改觀。

Perl 的優(yōu)勢(shì)
對(duì)于 C/C++/Java 程序員而言,Perl 在某些方面的優(yōu)勢(shì)是無(wú)價(jià)的。例如正則表達(dá)式在 Perl 中的實(shí)現(xiàn)是輕而易舉的,但在 C、C++ 或 Java 中實(shí)現(xiàn)起來(lái)卻很麻煩。隱含的函數(shù)聲明、不嚴(yán)格的語(yǔ)法、以及象日用文檔似的程序結(jié)構(gòu)使得 Perl 更具吸引力。

Perl 并不適合于所有人。它需要讀者去適應(yīng),卻接受它的所有缺點(diǎn)和優(yōu)點(diǎn)。我們并不是覺得 Perl 酷才采用它,而是因?yàn)樗拇_是一種非常好的工具。如果在解決某個(gè)問題時(shí)使用其他語(yǔ)言更合適,那么就應(yīng)該放棄 Perl。一個(gè)好程序員的手頭總是有好幾種有用的工具。

Perl 有一些小的不足,但那些不知疲憊的程序員會(huì)忽略掉這些缺點(diǎn)。如果的確需要線程和 Unicode 支持,或是嚴(yán)格的面向?qū)ο缶幊?,那么你只好根?jù)這些需要來(lái)選擇其他更合適的語(yǔ)言了。

Perl 是一門通用的靈活的語(yǔ)言,可以象膠水一樣將其他許多不同的模型粘合起來(lái)。它能夠?qū)崿F(xiàn)任何過程或函數(shù)的算法。通常情況下,Perl 會(huì)大大減少開發(fā)的時(shí)間,因?yàn)樗鼘?duì)某些常見的任務(wù)(例如對(duì)散列表中的所有元素做操作)只需要少量的代碼。最重要的是,Perl 編程總是相當(dāng)于一個(gè)有趣的學(xué)習(xí)過程。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=17168

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
【轉(zhuǎn)載】從C到Perl
一文學(xué)會(huì)Perl語(yǔ)言
四種Java腳本語(yǔ)言之評(píng)測(cè)4eacbad93b069f6c>>Java教程頻道
PHP新手上路--eXdream blog
perl基本語(yǔ)法
perl學(xué)習(xí)筆記----從五分鐘到三十秒
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服