Perl常見(jiàn)問(wèn)題專(zhuān)家解答
本文和大家重點(diǎn)討論一下Perl常見(jiàn)問(wèn)題, Perl有足夠的彈性和擴(kuò)充性,從只需要寫(xiě)短短一行的檔案處理工作到復(fù)雜的系統(tǒng),幾乎沒(méi)有什麼做不到的。對(duì)有些人來(lái)說(shuō),Perl的是拿來(lái)做寫(xiě)shell程式的理想替代品。
Perl常見(jiàn)問(wèn)題集錦
◆Perl常見(jiàn)問(wèn)題一:Perl和其他的程式語(yǔ)言比起來(lái)如何?例如Java,Python,REXX,Scheme,或Tcl?
Perl在某些地方比較好,某些地方較差。精確地說(shuō)到底哪些方面好或壞通常視個(gè)人偏好而定,所以在新聞?dòng)懻撊褐袉?wèn)這種問(wèn)題很可能會(huì)掀起一場(chǎng)毫無(wú)建設(shè)性的圣戰(zhàn)。
要比較各語(yǔ)言的異同***的方法是試著用不同的語(yǔ)言寫(xiě)功能相同的程式。各程式語(yǔ)言都各有屬於它們各自的新聞?dòng)懻撊?,您可從中學(xué)習(xí)(但希望您不是去和人辨論吵架的)。
◆Perl常見(jiàn)問(wèn)題二:我可以用Perl來(lái)做【某種差事】嗎?
Perl有足夠的彈性和擴(kuò)充性,從只需要寫(xiě)短短一行的檔案處理工作到復(fù)雜的系統(tǒng),幾乎沒(méi)有什麼做不到的。對(duì)有些人來(lái)說(shuō),Perl的是拿來(lái)做寫(xiě)shell程式的理想替代品。其他人則用高階的Perl來(lái)替代處理許多原先需要用C或C++一類(lèi)的低階語(yǔ)言來(lái)達(dá)到的程式。哪些差事決定要用Perl來(lái)處理,這一切都得看您(或許還有您的經(jīng)理...)。
如果您有一個(gè)提供API的程式庫(kù)的話,您可用C或C++來(lái)寫(xiě)一個(gè)Perl延伸,然後便可透過(guò)它將程式庫(kù)中的任何一部分動(dòng)態(tài)載入您的Perl主程式中。您也可以反過(guò)來(lái),用C或C++來(lái)寫(xiě)主程式,然後以即時(shí)動(dòng)態(tài)載入的方式插入一些Perl程式碼,產(chǎn)生一個(gè)威力強(qiáng)大的應(yīng)用程式。
話雖如此,對(duì)解決某些特定的問(wèn)題,使用小型、專(zhuān)精,專(zhuān)為特殊用途設(shè)計(jì)的語(yǔ)言總是比較方便的。Perl的設(shè)計(jì)是盡力地滿足各種不同人的需要,因而不特別偏頗任何人。至於特殊功能語(yǔ)言的例子,隨便舉兩個(gè),譬如prolog和matlab便是。
◆Perl常見(jiàn)問(wèn)題三:哪些場(chǎng)合下不適合用Perl?
當(dāng)您的主管禁止的時(shí)候--不過(guò)請(qǐng)務(wù)必考慮把他們換掉。
說(shuō)真的,如果您已經(jīng)有用另一個(gè)語(yǔ)言寫(xiě)成的應(yīng)用程式(而且寫(xiě)得很好)的時(shí)候,或者是已經(jīng)有替某些特定的工作設(shè)計(jì)的語(yǔ)言(例如:prolog,make),這個(gè)時(shí)候就不需要用Perl。
由於種種因素,Perl大概不太適合拿來(lái)做即時(shí)內(nèi)嵌式系統(tǒng)、屬於低層級(jí)的作業(yè)系統(tǒng)發(fā)展工作,例如周邊設(shè)備的drivers或環(huán)境轉(zhuǎn)換碼、復(fù)雜的多線共用記憶體應(yīng)用程式,或非常大的應(yīng)用程式。您會(huì)發(fā)現(xiàn)Perl本身便不是以Perl寫(xiě)成的。
剛出爐的Perl純碼編譯器或許可幫忙去除一些上述的限制,但您要了解:Perl在本質(zhì)上仍是一活性變數(shù)語(yǔ)言(dynamicallytypedlanguage),而非固性變數(shù)(staticallytyped)。只要您不將核電廠或腦科手術(shù)監(jiān)視器所用的程式放心地用Perl來(lái)寫(xiě),您自然就不會(huì)闖禍遭殃。這樣Larry晚上也可以睡得安穩(wěn)些--股市分析程式不在此限。
◆Perl常見(jiàn)問(wèn)題四:「perl」和「Perl」有什麼不同?
二者差一個(gè)位元。喔,您不是說(shuō)在ASCII上的差別???Larry現(xiàn)在用「Perl」來(lái)代表語(yǔ)言本身,而以「perl」來(lái)表示該語(yǔ)言的體現(xiàn),即目前的解譯器。因此,作者有句幽默小語(yǔ)說(shuō):「只有perl可以解譯Perl」。要不要遵照這個(gè)用法是您的自由。舉一反叁的話,我們可依樣畫(huà)葫蘆地說(shuō)「awk和perl」還有「Python和Perl」,但卻不可將「awk和Perl」或是「Python和perl」擺在一起。
◆Perl常見(jiàn)問(wèn)題五:Perl程式應(yīng)算是program還是script?
都無(wú)所謂。按標(biāo)準(zhǔn)術(shù)語(yǔ)來(lái)講,program指已經(jīng)由編譯程序編譯好、轉(zhuǎn)為機(jī)器碼,可多次執(zhí)行的程式;而script則是每次執(zhí)行時(shí)都必須透過(guò)一個(gè)解譯程式來(lái)解譯。然而,Perl程式嚴(yán)格說(shuō)來(lái),既非編譯(compiled),亦非解譯式(interpreted);因Perl程式可轉(zhuǎn)譯成位元碼形式存在(可說(shuō)是某種Perl虛擬機(jī)器[virtualmachine]),或轉(zhuǎn)譯為完全不同的語(yǔ)言,如C或組合語(yǔ)言。所以光看原始碼很難說(shuō)它到底是替純解譯器、或是parse-tree解譯器、位元碼解譯器,還是純碼編譯器而寫(xiě);因此這題很難給它一個(gè)確切的答案。
◆Perl常見(jiàn)問(wèn)題六:JAPH是什麼?
這是過(guò)去一些在討論群中自稱(chēng)``justanotherperlhacker''的人的簽名檔,約有一百個(gè)比較早期的,可在http://www.perl.com/CPAN/misc/japh取得。
◆Perl常見(jiàn)問(wèn)題七:到哪兒可拿到LarryWall的智慧諷語(yǔ)(witticisms)?
一百多條Larry的諷語(yǔ),源自他【在討論群】的posts或原始碼,可在http://www.perl.com/CPAN/misc/lwall-quotes取得。
我要如何取信、說(shuō)服我的系統(tǒng)管理者/上司/屬下使用第5/5.004版的Perl,而不去用其他的語(yǔ)言?
如果您的管理階層或?qū)傧聦?duì)沒(méi)有支援的軟體,或是未正式包含在所購(gòu)買(mǎi)的作業(yè)系統(tǒng)中的軟體存有戒心的話,您可以試著從有助他們自身利益這方面下手。因?yàn)槿绻淌皆O(shè)計(jì)師能由善加利用Perl的結(jié)構(gòu)、功能性、簡(jiǎn)單性,和威力而獲得更大的生產(chǎn)力的話,那麼典型的管理者/上司/員工或許便可因而加以說(shuō)服。此外,使用Perl,總的來(lái)講,和其他語(yǔ)言相較,或許也有助於減少交件的時(shí)間。強(qiáng)調(diào)這個(gè)論點(diǎn)或許對(duì)說(shuō)服他們會(huì)有幫助。
如果您的專(zhuān)題碰到瓶頸,特別是有關(guān)轉(zhuǎn)譯或測(cè)試方面的問(wèn)題,那麼Perl可以說(shuō)絕對(duì)會(huì)是一個(gè)既可行且快的解決之道。您在當(dāng)說(shuō)客的時(shí)候,千萬(wàn)別忘了要提:Perl已被世界上許多大型的軟硬體公司廣泛、大量地使用,極為可靠、有效。事實(shí)上,現(xiàn)Perl已成為許多Unix業(yè)者所售的作業(yè)系統(tǒng)的標(biāo)準(zhǔn)配備了。而且如果您無(wú)法在詳盡的使用說(shuō)明,包括這份FAQ之中為您的問(wèn)題找到解答的話,送封post到新聞?dòng)懻撊杭纯伞?/p>
如果您面對(duì)反對(duì)perl升級(jí)的聲音,那麼告訴他們Perl發(fā)展小組已經(jīng)完全不再維護(hù)或支援第四版的perl了。perl5的另一個(gè)大賣(mài)點(diǎn)是它有大量的模組和延伸,可大大減少計(jì)畫(huà)的發(fā)展時(shí)間。還有,告訴他們第四和第五版Perl之間的差異就如awk和C++的差別一樣(嗯,或許沒(méi)有差得那麼明顯,但您知道我的意思就好)。如果您想得到支援而且想確保您現(xiàn)在所發(fā)展的軟體在未來(lái)能繼續(xù)工作的話,那麼您得跑有支援的版本。這大概也就是說(shuō)要跑5.004版的,盡管5.003版仍算是不錯(cuò)(它只落後一年、一版)。不過(guò)因?yàn)橛行﹪?yán)重的bugs曾在5.000和5.002版之間被消除,所以您至少應(yīng)升級(jí)到比這幾個(gè)版本高才是。#p#
◆Perl常見(jiàn)問(wèn)題八:哪些平臺(tái)上有Perl?要到哪里去找?
Perl的標(biāo)準(zhǔn)發(fā)行版(由perl發(fā)展小組負(fù)責(zé)維護(hù))僅以原始碼形式發(fā)行。您可在http://www.perl.com/CPAN/src/latest.tar.gz處取得。這個(gè)檔案的格式是POSIXtar檔案柜,再以gzip格式壓縮。這套原始碼完全不需任何移植工作便可輕易地在絕大多數(shù)的Unix系統(tǒng)(Perl的原生系統(tǒng)),以及Plan9、VMS、QNX、OS/2,和Amiga上編譯安裝完成。盡管有謠傳說(shuō)(即將推出的)第5.004版或許能直接在WindowsNT上成功地編譯和安裝,但這尚待證實(shí)。適合32位元的微軟系統(tǒng)和蘋(píng)果系統(tǒng)、以執(zhí)行檔形式發(fā)行的Perl各可在http://www.perl.com/CPAN/ports/這個(gè)目錄底下找到。由於這兩個(gè)不屬於標(biāo)準(zhǔn)發(fā)行的一部分,它們可能(事實(shí)上的確)和基本的Perl有多方面的不同。要確切知道到底哪些地方不同,您得自行查閱它們 各自的發(fā)行說(shuō)明。這些差異可能是正面的(譬如它們可能附有一些原始碼發(fā)行的perl所沒(méi)有的延伸,提供專(zhuān)屬某一平臺(tái)的特殊功能),亦或負(fù)面的(例如它們可能是植基於比較老舊的Perl原始碼發(fā)行版)。
一個(gè)實(shí)用、專(zhuān)為Win32Perl使用者編寫(xiě)的FAQ可在 http://www.endcontsw.com/people/evangelo/Perl_for_Win32_FAQ.html處取得。
◆Perl常見(jiàn)問(wèn)題九:要如合取得以執(zhí)行檔形式發(fā)行的Perl?
不管為什麼您的作業(yè)系統(tǒng)業(yè)者沒(méi)有將C編譯器附在所賣(mài)的作業(yè)系統(tǒng)中,***的方法是到網(wǎng)路上去抓一份gcc的執(zhí)行檔,然後用它來(lái)編譯perl。CPAN上所放的gcc執(zhí)行檔僅專(zhuān)門(mén)提供幾個(gè)特別難拿到免費(fèi)編譯器的平臺(tái),而不是給任何Unix系統(tǒng)的。
您的***步應(yīng)該是查看http://www.perl.com/CPAN/ports這個(gè)檔案,看看可以拿到哪些安裝資料。http://www.cs.ruu.nl/~piet/perl5dos.html提供了一份有關(guān)在DOS上安裝perl的資料;而http://www.cs.ruu.nl/~piet/perlwin3.html則是關(guān)於在Windows3.1上安裝的資料。
◆Perl常見(jiàn)問(wèn)題十:我的系統(tǒng)里沒(méi)有C編譯器。要如何編譯perl?
因?yàn)槟鷽](méi)有C編譯器,您是沒(méi)指望了,而您的經(jīng)銷(xiāo)商則該拿去當(dāng)作祭拜列位升陽(yáng)神的供品。不過(guò)說(shuō)這些風(fēng)涼話無(wú)濟(jì)於事。
您首先需要做的是替您的系統(tǒng)找一個(gè)gcc的執(zhí)行檔。參閱和您的作業(yè)系統(tǒng)相關(guān)的各UsenetFAQs,看到哪里可以找到這種作業(yè)系統(tǒng)的gcc執(zhí)行檔。
我直接將Perl的執(zhí)行檔從一臺(tái)機(jī)器上復(fù)制到另一臺(tái)機(jī)器上,但是程式跑不起來(lái)。那大概是您忘了復(fù)制程式庫(kù),或者是程式庫(kù)的路徑不同的關(guān)系。您真的應(yīng)該在那臺(tái)要安裝perl的機(jī)器上將整套發(fā)行從頭編譯,然後打makeinstall來(lái)安裝。其他的方法大多注定要失敗。
有一個(gè)簡(jiǎn)單的方法可用來(lái)檢查和確定東西有沒(méi)有裝對(duì)地方--把編入perl的@INC陣列(perl用它來(lái)尋找程式庫(kù)的路徑)印出:perl-e'printjoin("\n",@INC)'
如果這個(gè)指令列出了任何在您系統(tǒng)上不存在的路徑,那麼您或許得將適當(dāng)?shù)某淌綆?kù)移到這些地方,或者制做適當(dāng)?shù)膕ymlinks、aliases或捷徑。
您或許會(huì)想看看HowdoIkeepmyownmodule/librarydirectory?。
我抓回了原始碼,試著編譯perl,但是gdbm/dynamicloading/malloc/linking/...部分失敗。要如何將它搞定?
細(xì)讀INSTALL這個(gè)檔案,這是原始碼發(fā)行版里面的一個(gè)檔案。有時(shí)候自動(dòng)設(shè)定程式(Configure)對(duì)某些較不尋常的系統(tǒng)、平臺(tái)特質(zhì)、或變異會(huì)不知所措。該檔案對(duì)該如何處這類(lèi)的問(wèn)題,大都有詳細(xì)的說(shuō)明。
◆Perl常見(jiàn)問(wèn)題十一:Perl有哪些模組和延伸?CPAN是什麼?CPAN/src/...又代表什麼?
CPAN代表的是「大Perl檔案庫(kù)網(wǎng)絡(luò)」(ComprehensivePerlArchiveNetwork),一個(gè)在全世界數(shù)十臺(tái)機(jī)器之間相互映射的巨大檔案庫(kù)。CPAN包含了原始碼、對(duì)各非原生系統(tǒng)的移植、使用說(shuō)明、程式,以及許多由第叁類(lèi)團(tuán)體所寫(xiě)的模組和延伸,從各商業(yè)品牌的資料庫(kù)介面、到鍵盤(pán)/螢?zāi)豢刂?,乃至全球資訊網(wǎng)漫游及CGI程式皆一應(yīng)具全。CPAN的總主機(jī)是ftp://ftp.funet.fi/pub/languages/perl/CPAN/,但您也可以透過(guò)這個(gè)位址:http://www.perl.com/CPAN/CPAN.html來(lái)自動(dòng)連接一個(gè)在地理位置上最接近您的站。至於這個(gè)設(shè)計(jì)的運(yùn)作原理,請(qǐng)看http://www.perl.com/CPAN(最後頭沒(méi)有斜線)的說(shuō)明。
CPAN/路徑/...是CPAN站臺(tái)上頭的檔案的命名規(guī)范。CPAN代表一個(gè)CPAN映射的基準(zhǔn)目錄,然後其馀的路徑是由該目錄到一個(gè)檔案的路徑。例如,如果您使用ftp://ftp.funet.fi/pub/languages/perl/CPAN來(lái)做您的CPAN站,那麼CPAN/misc/japh這個(gè)檔案便可以從ftp://ftp.funet.fi/pub/languages/perl/CPAN/misc/japh抓下來(lái)。
由於目前CPAN檔案庫(kù)中已經(jīng)有數(shù)百個(gè)模組,因此幾乎任何您所能想到的用途,大概都已經(jīng)有現(xiàn)成的模組可以辦到。目前在CPAN/modules/by-category/底下的類(lèi)別包括了perl核心模組、協(xié)助發(fā)展模組、作業(yè)系統(tǒng)介面、網(wǎng)路、周邊設(shè)備、不同processes間之溝通、資料型態(tài)工具、資料庫(kù)介面、使用者介面、與其他語(yǔ)言介面、檔名、檔案系統(tǒng)、檔案鎖定、軟體國(guó)際化及地方化、全球資訊網(wǎng)支援、伺服軟體工具、檔案庫(kù)和檔案壓縮、圖形變換處理、電子郵件及新聞?dòng)懻撊?、程式流程控制工具、filehandles和輸入/輸出、微軟視窗模組,以及雜項(xiàng)模組等。
◆Perl常見(jiàn)問(wèn)題十二:是不是有一個(gè)經(jīng)ISO【國(guó)際標(biāo)準(zhǔn)局】或ANSI【美國(guó)國(guó)家標(biāo)準(zhǔn)局】認(rèn)可的Perl版本?
當(dāng)然沒(méi)有。Larry認(rèn)為他得先被認(rèn)可後然後才會(huì)輪到Perl。
◆十三Perl的相關(guān)資料要上哪兒找?
perl的發(fā)行版中都附有完整的使用說(shuō)明中。如果perl已安裝在您的機(jī)器上,那麼使用說(shuō)明應(yīng)該也已經(jīng)裝在上頭了:如果您用的是一個(gè)像Unix的系統(tǒng),您可以打manperl。這同時(shí)會(huì)帶領(lǐng)您到其他重要的使用說(shuō)明頁(yè)。如果您用的不是Unix式的系統(tǒng),那麼查閱使用說(shuō)明的方法會(huì)有所不同;譬如說(shuō),使用說(shuō)明可能會(huì)以HTML格式來(lái)存放。不管怎麼樣,只要perl正確地安裝,查閱使用說(shuō)明應(yīng)該不成問(wèn)題。
如果您的系統(tǒng)沒(méi)有man這個(gè)指令,或者是該指令安裝不當(dāng),那麼您可以試試perldocperl。如果還不成,您可以在/usr/local/lib/perl5/pod這個(gè)目錄下找使用說(shuō)明。
如果以上的方法全失敗,那麼您可求助於CPAN/doc這個(gè)目錄,該目錄底下存有完整的使用說(shuō)明,有各種不同的格式,包括了原始的pod格式、troff、html,以及純文字式。還有http://www.perl.com/perl/info/documentation.html這個(gè)網(wǎng)頁(yè)可能也會(huì)對(duì)您有幫助。
另外值得一提的是,在CPAN/authors/id/BMIDD這個(gè)目錄底下有一個(gè)完整的PDF版本的使用說(shuō)明。
【編輯推薦】
- Perl常見(jiàn)問(wèn)題集錦
- 學(xué)習(xí)筆記 Perl基本語(yǔ)法
- Perl引用中直接引用用法解析
- Perl語(yǔ)法 解析Perl變量使用
- 技術(shù)分享 解析Perl模塊創(chuàng)建和導(dǎo)入方法