Perl 如何拯救了人類(lèi)基因計(jì)劃
發(fā)布時(shí)間:2008-08-06 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
原始出處: http://www.tpj.com/
本文作者: Lincoln Steinx
本文譯者: tcwu
Reprinted courtesy of the Perl Journal, http://www.tpj.com/
Lincoln Stein's website is http://stein.cshl.org/
位置:英國(guó)劍橋,歐洲最大的 DNA 定序研究中心的會(huì)議室
場(chǎng)合:本中心與美國(guó)最大的 DNA 定序研究中心的電腦科學(xué)家的高階層會(huì)議
問(wèn)題:雖然這兩個(gè)中心使用幾乎相同的實(shí)驗(yàn)技術(shù),幾乎相同的數(shù)據(jù)庫(kù),還有幾乎相同的資料分析工具,卻仍然無(wú)法交換或者比較出有意義的結(jié)果。
解決方案:Perl
人類(lèi)基因計(jì)劃在大約 1990 開(kāi)始雄心勃勃的開(kāi)始發(fā)展,期望能以國(guó)際合作的力量找出人類(lèi)以及部分實(shí)驗(yàn)動(dòng)物的完整 DNA 序列。這項(xiàng)工作的性質(zhì)兼具科學(xué)與醫(yī)藥。藉由了解生物起源的構(gòu)造,以及種種令人苦惱的細(xì)節(jié),我們希望能夠了解有機(jī)體如何由一顆卵發(fā)展到復(fù)雜的多細(xì)胞生物,食物如何代謝以及被轉(zhuǎn)換成身體的一部分,以及神經(jīng)系統(tǒng)如何流暢的工作。從醫(yī)學(xué)的角度來(lái)看,從全盤(pán)了解完整的 DNA 序列得來(lái)的知道,能夠有效的加速找出人類(lèi)疾病(以及可能的疾病)的原因。
經(jīng)過(guò)六年的努力,基因計(jì)劃已經(jīng)超越原先的計(jì)劃日程了。人類(lèi)以及實(shí)驗(yàn)動(dòng)物的詳細(xì)基因地圖已經(jīng)完成了(用一連串的標(biāo)記來(lái)安排 DNA 是決定完整序列的第一步)。最小的有機(jī)體,酵母,已經(jīng)近乎完成,接著下一個(gè),細(xì)小的蠕蟲(chóng)也不遠(yuǎn)了。幾個(gè)月以前大規(guī)模的人類(lèi) DAN 定序工作已經(jīng)在各中心展開(kāi),并且在整年中都會(huì)全力進(jìn)行。
從資訊處理的角度來(lái)看,DNA 是一個(gè)非常長(zhǎng)的字串且由四個(gè)字母構(gòu)成,分別是 A,T,G,C(這四個(gè)字母分別為四種化學(xué)物質(zhì)的縮寫(xiě),是構(gòu)成雙股螺旋的基礎(chǔ)。字串的長(zhǎng)度令人印象深刻但也不是讓人特別驚訝: 3 x 10^9 的字母長(zhǎng),或者如果你用一個(gè)位元來(lái)儲(chǔ)存每個(gè)字母的話,需要 3GB 的儲(chǔ)存空間。
3GB 不小但是以今天的標(biāo)準(zhǔn)無(wú)疑的可以被管理。不幸的是,這只是儲(chǔ)存結(jié)果所需要的空間。要得到這些結(jié)果所需要的儲(chǔ)存空間遠(yuǎn)遠(yuǎn)大的多。根本的問(wèn)題在於,目前的 DNA 定序技術(shù)一次最多只能讀到 500 個(gè)連續(xù)的字母。為了決定更長(zhǎng)的序列,必須將 DNA 定序?yàn)橐恍K一小塊部分重疊的片段,稱(chēng)為”reads”,這些拼圖般的區(qū)域用演算法來(lái)檢查并找出相配的地方。因?yàn)?DNA 序列并非隨機(jī)的(相似但并非完全一樣的基本圖案在基因中出現(xiàn)很多次),而且因?yàn)?DNA 定序技術(shù)有雜訊且傾向於錯(cuò)誤,必須針對(duì)某個(gè)區(qū)域作 5 到 10 次,才能可靠的把”reads”片段重組成真正的序列,這增加了要管理的資料的數(shù)量。在這之上的是與實(shí)驗(yàn)室工作相關(guān)的資訊: 誰(shuí)進(jìn)行了實(shí)驗(yàn),什麼時(shí)候完成的,被定序的基因區(qū)段,用哪個(gè)軟件以及哪個(gè)版本重組序列,對(duì)實(shí)驗(yàn)加上的注解,等等。除此之外,一般人通常想要將定序用的機(jī)器產(chǎn)生的原始資料儲(chǔ)存下來(lái),每 500 個(gè)字母會(huì)產(chǎn)生 20-30kilobytes 長(zhǎng)度的資料檔案!
這還并非全部。只決定 DNA 序列是不夠的。在這些序列里面,有功能的區(qū)域散布在很長(zhǎng)的沒(méi)有功\能的區(qū)域中。人類(lèi) DNA 中有基因,控制區(qū)域,結(jié)構(gòu)區(qū)域,甚至有些病毒卷入人體中并且變成了化石遺跡。因?yàn)榛蚋刂茀^(qū)域負(fù)責(zé)健康與疾病,研究者會(huì)想要標(biāo)示以其注解它們當(dāng)它們被重組的時(shí)候。這類(lèi)的注解產(chǎn)生了更多的資料需要被追蹤與儲(chǔ)存。
某些人評(píng)估居會(huì)有 1 至 10TB 的資訊需要被儲(chǔ)存才能看出人類(lèi)基因計(jì)劃的結(jié)論。
所以 Perl 能做什麼呢?從一開(kāi)始研究者就了解到資訊學(xué)將會(huì)在基因計(jì)劃中扮演很重要的角色。一個(gè)整合每個(gè)基因中心的資訊學(xué)核心被建立了。這些核心的任務(wù)有兩個(gè): 提供電腦支援和數(shù)據(jù)庫(kù)福對(duì)給他們相關(guān)的實(shí)驗(yàn)室,還有發(fā)展資料分析和管理軟件給整個(gè)基因研究社群。
公平的來(lái)說(shuō),資訊科學(xué)小組一開(kāi)始的結(jié)果是好壞參雜的。有些小組試圖在復(fù)雜的關(guān)聯(lián)數(shù)據(jù)庫(kù)上面建立大型的系統(tǒng),它們一次又一次的受到生物研究的高度動(dòng)態(tài)的阻撓。當(dāng)一套系統(tǒng)里里外外運(yùn)作都與復(fù)雜的實(shí)驗(yàn)室協(xié)定正常配合,被實(shí)作出來(lái)且經(jīng)過(guò)除錯(cuò),新的科技已經(jīng)取代了舊的協(xié)定,於是軟件工程師又得回到設(shè)計(jì)版前。
然而,大多數(shù)的小組學(xué)會(huì)了建構(gòu)模組化的,松散結(jié)合的系統(tǒng),這些系統(tǒng)的部分可以被拿出來(lái)或放進(jìn)去而不需要重新更換整套系統(tǒng)。舉例來(lái)說(shuō),在我的小組里面,我們發(fā)現(xiàn)許多資料分析工作牽涉到一連串的半獨(dú)立的步驟,假想某人想要操作一個(gè)剛剛被定只好的位元(圖一)。首先需要一個(gè)基本的品質(zhì)測(cè)試:序列夠不夠長(zhǎng) ? 含糊不清的字元是不是在最大限制以下? 接著有”向量檢查”。為了技術(shù)上的理由,人類(lèi) DNA 在被定序前必須經(jīng)過(guò)細(xì)菌處理(這就是”復(fù)制”的程序)。并不常發(fā)生,但是人類(lèi) DNA 有時(shí)候會(huì)在處理的過(guò)程中遺失,而且整個(gè)序列包含了細(xì)菌的向量。向量檢查確保只有人類(lèi)的基因被記載到數(shù)據(jù)庫(kù)里面。接下來(lái)是反覆序列的檢查。人類(lèi) DNA 充滿(mǎn)了重復(fù)的元素,使得將拼圖安裝在一起變的富有挑戰(zhàn)性。重復(fù)序列測(cè)試試圖由一個(gè)已知重復(fù)序列的數(shù)據(jù)庫(kù)找出新序列,倒數(shù)第二個(gè)測(cè)試則是試圖找出新的序列靠著對(duì)照於一個(gè)很大的社群的 DNA 序列數(shù)據(jù)庫(kù)。在這時(shí)候一個(gè)比對(duì)成功通常能提供線索找到新序列的功\能。完成這些測(cè)試之後,序列以及它的資訊已經(jīng)被收集且載入了實(shí)驗(yàn)室的區(qū)域性數(shù)據(jù)庫(kù)。
將 DNA 序列通過(guò)這些獨(dú)立分析步驟的過(guò)程看起來(lái)很像一根水管,因此不用多久我們就了解 Unix 系統(tǒng)上面的”pipe”可以操作項(xiàng)工作。我們發(fā)展了一個(gè)簡(jiǎn)單的以 Perl 為基礎(chǔ)的資料交換格式,叫做”boulderio”,這格式允許松散連結(jié)的程序加入資訊到以導(dǎo)管(pipe)為基礎(chǔ)的輸入/輸入字串流。 Boulderio 的基礎(chǔ)是一對(duì)一對(duì)標(biāo)簽/值。Perl 模組讓獲得輸入很容易,取出他們有興趣的標(biāo)簽,在上面作一些事情,然後丟回輸出字串流。所有該程序不感興趣的標(biāo)簽被傳到標(biāo)準(zhǔn)輸出,所以其他的程序可以使用它們。
在這種形式的設(shè)計(jì)下,分析一個(gè)新 DNA 序列看起來(lái)像是這樣(這并非我們真正在用的程序源代碼,但已經(jīng)很接近了)
name_sequence.pl < new.dna |
quality_check.pl |
vector_check.pl |
find_repeats.pl |
search_big_database.pl |
load_lab_database.pl
1 一個(gè)包含新的 DNA 序列的檔案會(huì)一個(gè)叫做 "name_sequence.pl" 的 perl script 處理,該程序的任務(wù)只是給予這個(gè)序列一個(gè)新的且唯一的名字并且將他輸出成 boulder 格式,它的輸出看起來(lái)像:
NAME=L26P93.2
SEQUENCE=GATTTCAGAGTCCCAGATTTCCCCCAGGGGGTTTCCAGAGAGCCC......
來(lái)自 name_sequence.pl 的輸入接著被傳入品質(zhì)檢查程序,它會(huì)找尋 SEQUENCE 標(biāo)簽,跑品質(zhì)檢查演算法,然後把它的結(jié)論寫(xiě)到資料字串流里面。資料字串流現(xiàn)在看起來(lái)像:
NAME=L26P93.2
SEQUENCE=GATTTCAGAGTCCCAGATTTCCCCCAGGGGGTTTCCAGAGAGCCC......
QUALITY_CHECK=OK
現(xiàn)在資料字串流進(jìn)入了向量檢查。它會(huì)從字串流中取出 SEQUENCE 標(biāo)簽并且執(zhí)行向量檢查演算法。資料字串流現(xiàn)在看起來(lái):
NAME=L26P93.2
SEQUENCE=GATTTCAGAGTCCCAGATTTCCCCCAGGGGGTTTCCAGAGAGCCC......
QUALITY_CHECK=OK
VECTOR_CHECK=OK
VECTOR_START=10
VECTOR_LENGTH=300
這些東西繼續(xù)通過(guò)導(dǎo)管(pipeline),直到最後 "load_lab_database.pl" 程序核對(duì)所有收集的資料,將一些最後的結(jié)論是否適合未來(lái)適合標(biāo)記起來(lái),以及把所有的結(jié)果送入實(shí)驗(yàn)室的數(shù)據(jù)庫(kù)。Boulderio 格式的一個(gè)很好的特性就是許多個(gè)序列的紀(jì)錄可以被連續(xù)的在 Unix 導(dǎo)管里面被處理。用一個(gè)”=”表示表示一筆記錄的結(jié)尾,以及下筆資料的開(kāi)始:
NAME=L26P93.2
SEQUENCE=GATTTCAGAGTCCCAGATTTCCCCCAGGGGGTTTCCAGAGAGCCC......
=
NAME=L26P93.3
SEQUENCE=CCCCTAGAGAGAGAGAGCCGAGTTCAAAGTCAAAACCCATTCTCTCTCCTC...
=
也可以在紀(jì)錄中再建立子紀(jì)錄,這使得我們可以使用結(jié)構(gòu)化的資料型態(tài)。
以下為范例源代碼,這個(gè)源代碼處理 boulderio 格式。它有物件導(dǎo)向的風(fēng)格,紀(jì)錄被從輸入字串流中拉出來(lái),修改,然後丟回字串流中。
use Boulder::Stream;
$stream = new Boulder::Stream;
while ($record = $stream->read_record('NAME','SEQUENCE')) {
$name = $record->get('NAME');
$sequence = $record->get('SEQUENCE');
...[continue processing]...
$record->add(QUALITY_CHECK=>"OK");
$stream->write_record($record);
}
(如果你對(duì) boulderio 格式有興趣,可以在 http://stein.cshl.org/software/boulder/找到更多資訊以及操作它所需要的 Perl 函式庫(kù))
有趣的是,好幾個(gè)資訊小組不約而同的發(fā)展出類(lèi)似 boulderio 的主意。舉例來(lái)說(shuō),好幾個(gè)參予的小組蠕蟲(chóng)定序計(jì)劃使用了一個(gè)資料交換格式叫做”.ace”。雖然這個(gè)格式一開(kāi)始被設(shè)計(jì)用來(lái)作 ACE(一種生物資料用的數(shù)據(jù)庫(kù))數(shù)據(jù)庫(kù)的資料傾印以及重復(fù)載入格式,可是它用了一個(gè)標(biāo)簽/值格式與 boulderio 很像。很快的,.ace檔案被用 Perl 程序?qū)Ч芩幚?,并且在最後一個(gè)步驟載入數(shù)據(jù)庫(kù)。
Perlll 實(shí)驗(yàn)室管理的其他部分也找到用途。舉個(gè)例子,許多中心,包括我的,使用以網(wǎng)頁(yè)為基礎(chǔ)的介面來(lái)顯示專(zhuān)案狀態(tài),并且讓研究者采取行動(dòng)。Perl 文稿語(yǔ)言是寫(xiě)作網(wǎng)頁(yè) CGI 引擎的完美語(yǔ)言。同樣的,Perl 執(zhí)行郵件數(shù)據(jù)庫(kù)查詢(xún)服務(wù)器,管理定期的工作,準(zhǔn)備每天晚上的實(shí)驗(yàn)室活動(dòng)總結(jié)報(bào)告,建立控制機(jī)器人的指令檔案,以其操作幾乎每個(gè)忙碌的基因?qū)嶒?yàn)室都會(huì)需要的資訊管理工作。
就實(shí)驗(yàn)室管理來(lái)看,資訊核心小組合理的成功了。就發(fā)展與散布性的一般用途,事情就沒(méi)有這麼樂(lè)觀了。
這些問(wèn)題與那些參與一個(gè)大型,松散的組織軟件專(zhuān)案的人的問(wèn)題將會(huì)很相似。盡管盡了最大的力,專(zhuān)案仍開(kāi)始飄移。程序員進(jìn)行那些令他們感興趣的想法,需要互相溝通介面的模組被獨(dú)立的設(shè)計(jì),而且同樣的問(wèn)題被以不同的,不能相同的方法解決了好幾次。當(dāng)需要將所有部分放在一起的時(shí)刻來(lái)臨,沒(méi)有一個(gè)能夠正常運(yùn)作。這些情形也發(fā)生在基因計(jì)劃上面。盡管事實(shí)是所有人都在同一個(gè)專(zhuān)案中工作,沒(méi)有兩個(gè)小組采用同樣的解法。用來(lái)解決已知問(wèn)題的程序被寫(xiě)了又寫(xiě)好幾次。當(dāng)不能保證一段程序片段工作的比其他地方發(fā)展出來(lái)的類(lèi)似程序好的時(shí)候,你只能指望夸耀它特殊的使用者介面以及資料格式。一個(gè)典型的例子是重組數(shù)以千計(jì)的短 DNA reads 成為一個(gè)排序過(guò)的重疊片段的集合用的核心演算法,至少有六種不同版本在各地被使用,而且沒(méi)有任何兩個(gè)有相同的資料輸入或輸出格式。
這種缺乏交換性表現(xiàn)出基因中心的嚴(yán)重的困境。沒(méi)有可交換性,一個(gè)資訊小組被鎖住只能用他們自家發(fā)展的軟件。如果其他基因中心做出更好的工具軟件來(lái)解決同樣的問(wèn)題,前者必須重新更患他們的系統(tǒng)來(lái)使用這個(gè)新工具。
這個(gè)問(wèn)題長(zhǎng)遠(yuǎn)的解法是提出每個(gè)基因軟件都該遵循的制式化的資料交換標(biāo)準(zhǔn)。這也讓公用的模組可以輕易的被裝入或卸下。然而,這樣的標(biāo)準(zhǔn)需要時(shí)間使大家都認(rèn)可,而當(dāng)不同的小組間參與討論與協(xié)商的時(shí)候,仍然有緊急的需求要用既有的工具來(lái)完成當(dāng)下的任務(wù)。
這時(shí)候再度用到了 Perl 并且達(dá)成了緊急救援。劍橋高級(jí)會(huì)議引述這篇文章并且請(qǐng)求商業(yè)資料交換的問(wèn)題。盡管事實(shí)上這兩個(gè)小組的關(guān)系是親密的合作者,而且粗淺的來(lái)看,似乎用同樣的工具來(lái)解決同樣的問(wèn)題,但是再接近一點(diǎn)觀察後可以發(fā)現(xiàn)他們做的事情沒(méi)有一件是一樣的。
在 DNA 定序?qū)0钢兄饕能浖?
一個(gè)追蹤編輯器,用來(lái)分析,顯示小片段的來(lái)自DNA定序機(jī)器的 DNA reads 色層。
一個(gè) read 組譯器,找出 reads 之間重復(fù)的部分并且重組他們成為連續(xù)的區(qū)間。
一個(gè)組譯器編輯器,觀看組譯器的結(jié)果并且在發(fā)現(xiàn)組譯錯(cuò)誤的時(shí)候能改變內(nèi)容。
一個(gè)能夠追蹤以上一切的數(shù)據(jù)庫(kù)。
經(jīng)過(guò)數(shù)年時(shí)間,這兩個(gè)小組已經(jīng)分別開(kāi)發(fā)出在他們手上可以順利工作的套件。照著類(lèi)似的基因中心模式,有些元件是自己發(fā)展而有些是從外面引進(jìn)的。如圖二所示, Perl 用來(lái)當(dāng)作膠水,把這些軟件片段組合在一起。在每對(duì)交互作用的模組之間,是一個(gè)或多個(gè) Perl 文稿負(fù)責(zé)將某個(gè)元件的輸出調(diào)整成另一個(gè)模組預(yù)期的樣子。然而,當(dāng)需要交換資料的時(shí)候來(lái)臨,這兩個(gè)小組遇到了困難。在他們兩組之間,有兩種追蹤編程器,三種組譯器,兩種組譯器編輯器以及(感謝上帝)一種數(shù)據(jù)庫(kù)。如果兩個(gè)元件之間需要兩個(gè) Perl 文稿的話(一個(gè)方向一個(gè)),會(huì)需要 62 個(gè)不同的文稿來(lái)滿(mǎn)足所有可能的互相交換的工作。每次當(dāng)其中一個(gè)模組的輸出或輸入格式改變,將要更動(dòng)檢查和修正 14 個(gè)文稿。
在這個(gè)會(huì)議中得的結(jié)論在圖三。這兩個(gè)小組決定采用一個(gè)共圖的資料交換格式,叫做 CAF。CAF 將會(huì)包含雙方的分析與編輯工具的的交集。對(duì)每個(gè)模組,有兩個(gè)模組分別將 CAF 轉(zhuǎn)換成該模組的資料格式,以及將其格式轉(zhuǎn)換成 CAF。這簡(jiǎn)化了寫(xiě)程序以及維護(hù)的工作?,F(xiàn)在只需要寫(xiě) 16 個(gè)文稿了;當(dāng)其中一個(gè)模組改變了,只有兩個(gè)模組需要跟著被檢查。
這個(gè)事件并非獨(dú)一無(wú)二的。Perl 已經(jīng)變成基因中心的解決方案,當(dāng)他們需要資料交換的時(shí)候,或是翻新某中心的模組來(lái)跟其他中心的一起工作的時(shí)候。
因此 Perl 已然成為基因中心之間計(jì)算的主要軟件,就好像膠水將它們連結(jié)在一起。雖然基因資訊小組總是在思考有沒(méi)有其他高階語(yǔ)言,例如 Python,Tcl 還有最近的 Java,卻沒(méi)有能像 Perl 這樣普及的。Perl 如何達(dá)成了這樣的非凡成就?
我想有以下幾個(gè)因素:
Perl 非常擅長(zhǎng)於切割,扭轉(zhuǎn),絞,弄平,總結(jié),以及其他的操作文字文件。雖然生物科學(xué)開(kāi)始采用數(shù)用分析,然而大部分的資料仍然是文字文件:繁殖名稱(chēng),注解,評(píng)住,目錄查閱。甚至DNA序列也是類(lèi)文字的?;ハ嘟粨Q不相容的資料格式是在文字文件上用創(chuàng)造性的猜測(cè)來(lái)處理的議題。Perl強(qiáng)大的正規(guī)表示式(regular expression)比對(duì)以及字串操作使這個(gè)工作變得簡(jiǎn)單而沒(méi)有其他語(yǔ)言能相比。
Perl 能容錯(cuò)。生物資料通常是不完全的,欄位可以被忽略,或是某個(gè)欄位被預(yù)期要出現(xiàn)好幾次(舉例來(lái)說(shuō),一個(gè)實(shí)驗(yàn)可能被重復(fù)的操作),或是資料以手動(dòng)輸入所以有錯(cuò)誤。 Perl并不介意某個(gè)值是空的或是有奇怪的字元。正規(guī)表示式能夠被寫(xiě)成取出并且更正錯(cuò)誤的一般錯(cuò)誤。當(dāng)然這種彈性也可能是各壞處。我將會(huì)在之後提後。
Perl 是元件導(dǎo)向的。Perl 鼓勵(lì)人們將他們的軟件寫(xiě)成小模組,不問(wèn)適用 Perl 函式庫(kù)模組或是正統(tǒng)的 Unix 工具導(dǎo)向的方式。外部程序能夠輕易的被整合進(jìn) Perl 程序,靠著管道(pipe),系統(tǒng)呼叫,或是插座(socket)。Perl5 引進(jìn)的動(dòng)態(tài)載入器允許人們使用 C 的函式,或者讓整個(gè)編程過(guò)的函式庫(kù),被使用在 Perl 直譯器中。最近的成果是世界各地的智慧結(jié)晶都會(huì)收錄在一組模組里面,稱(chēng)為”bioPerl”(請(qǐng)參考 Perl Journal)
Perl 很容易去寫(xiě)并且能很快開(kāi)發(fā)完。直譯器讓你不需要宣告你所有的函數(shù)型式以及資料型態(tài),當(dāng)未定義的函式被呼叫時(shí)只會(huì)引起一個(gè)錯(cuò)誤,除錯(cuò)器也能與Emacs很好的合作并且讓你能用令人舒服的交談式的開(kāi)發(fā)模式。
Perl 是良好的原型語(yǔ)言。因?yàn)樗於遗K(quick and dirty),用 Perl 建構(gòu)新演算的原型比直接寫(xiě)成一個(gè)快的需要編程過(guò)的語(yǔ)言來(lái)的有意義。有時(shí)候發(fā)現(xiàn)結(jié)果是Perl已經(jīng)夠快了,所以程序變不需要移植;更多情形是某人可以用C寫(xiě)一個(gè)小的核心程序,編程成動(dòng)態(tài)載入的模組或是外部的可執(zhí)行程序,然後其他的部分用Perl來(lái)完成。這部分的例子可以參考 http://waldo.wi.mit.edu/ftp/distribution/software/rhmapper/)。
Perl 在寫(xiě)作網(wǎng)頁(yè) CGI 方面非常優(yōu)秀,而且重要性隨著各實(shí)驗(yàn)將資料發(fā)表在網(wǎng)絡(luò)上之後更是增加。我在基因中心環(huán)境下使用 Perl 的經(jīng)驗(yàn)從頭到尾都是值得稱(chēng)贊的。然而我發(fā)現(xiàn) Perl 也有它的問(wèn)題。它的松散的程序風(fēng)格導(dǎo)致許多錯(cuò)誤,這些在其他嚴(yán)格的語(yǔ)言都會(huì)被抓到。舉例來(lái)說(shuō),Perl 讓你在一個(gè)變數(shù)在被指定值之前就能使用,這是個(gè)很有用的特性當(dāng)你需要的時(shí)候,但是卻是一個(gè)災(zāi)難當(dāng)你單純的打錯(cuò)了辨識(shí)名稱(chēng)。同樣的,很容易忘記要宣告一個(gè)函式里面的區(qū)域變數(shù),導(dǎo)致不小心地改到了全域變數(shù)。
最後,Perl 的不足之處在於建立圖形化的使用者介面。雖然 Unix 忠實(shí)信徒所有事情都能在命令模式下完成,大多數(shù)的終端使用者卻不同意。視窗,選單,彈跳的圖案已經(jīng)變成了必要的時(shí)尚。
直到最近,Perl 的使用者界面(GUI)發(fā)展仍是不成熟的。然而 Nick Ing-Simmons 的努力使得 perlTK(pTK) 的整合使得以 Perl 驅(qū)動(dòng)的使用者介面在 X-window 上面成為可能。我的夥伴和我曾經(jīng)在 MIT 基因中心寫(xiě)過(guò)幾個(gè) pTK 為基礎(chǔ)的應(yīng)用程序供互連網(wǎng)使用者,而且從頭到尾都是一個(gè)令人滿(mǎn)意的經(jīng)驗(yàn)。其他的基因中心則更大規(guī)模的使用 pTK,在某些地方已經(jīng)成為主要的生產(chǎn)力。
不幸的,我很難過(guò)的坦承,幾個(gè)月以前當(dāng)我需要將一個(gè)我寫(xiě)的 C++ 的圖形分析系統(tǒng)放上去,我使用了標(biāo)準(zhǔn)的 Tcl/Tk 函式庫(kù)而不是 pTK。我做了這個(gè)決定因?yàn)槲蚁M@個(gè)應(yīng)用程序能廣泛流傳。我發(fā)現(xiàn) pTK 在輸入方面仍然太不穩(wěn)定:一個(gè) pTK 的新發(fā)行版本發(fā)現(xiàn) lurking 的問(wèn)題。更進(jìn)一步,我發(fā)現(xiàn)即使是經(jīng)驗(yàn)豐富的系統(tǒng)管理者編程及安裝 Perl 模組的時(shí)候也會(huì)遇到問(wèn)題,而我擔(dān)心在安裝 pTK 或是我的應(yīng)用程序所需要的 Perl 模組的時(shí)候遇到大問(wèn)題,而就此放棄。相反的,許多系統(tǒng)擁有 Tcl/TK 函式庫(kù);即使沒(méi)有,安裝也是快又無(wú)痛的。
總之,當(dāng)基因計(jì)劃奠基在一片不相容的資料格式的海洋,快速變化的科技,以及龐大的,在發(fā)布當(dāng)天就已時(shí)的資料分析程序上時(shí)。Perl 拯救了這一切。雖然它并不完美。 Perl 似乎明顯的滿(mǎn)足了許多基因中心需要,而且經(jīng)常是當(dāng)我們遇到問(wèn)題時(shí)第一個(gè)想到的工具。