[Perl] 程式設計教學:21 世紀的 Perl

【分享本文】
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
【贊助商連結】

    近年來,Perl 的確在式微中。在 Perl、Python、Ruby 三個性質接近的程式語言中,許多新的應用都會優先發表相對應的 Python 套件;反之,很少開發團隊會主動寫新的 Perl 套件。每隔一陣子,就會有某篇部落格文章說「Perl 已死」,現在仍然值得學 Perl 嗎?

    筆者認為,即使到了 21 世紀,Perl 仍然可以學,但我們對 Perl 的視角略為調整。我們將 Perl 視為一種具有程式語言功能的命令列工具,而非一種通用型程式語言。在這種思維下,我們僅需學習其中一部分的 Perl 特性,就足以滿足我們日常任務的需求;相對來說,有些特性可以暫時不學,需要時再補足即可。

    目前來說,可以優先學習的特性如下:

    • Perl one-liner,這是在命令列直接使用 Perl 程式的方式
    • 撰寫簡短、重用性低的命令稿
    • 取代 shell scripts
    • 執行一些現有的函式庫或應用程式

    相對來說,以下特性優先次序較低:

    • 撰寫物件導向程式
    • 撰寫新的套件
    • 撰寫新的應用程式

    在類 Unix 系統中,和文字處理高度相關的命令列工具有 grep(1)sed(1)awk(1)perl(1)ruby(1)。在這些工具中,AWK、Perl、Ruby 具有處理欄位 (column) 的能力,也具有完整的程式語法,算是兼具命令列工具和程式語言特性的軟體。

    由於 perl 可以寫出等效而略長的 grepsedawk 指令,而 Perl 的正規表示式特性又比這些工具強;筆者的 sed 和 AWK 老是學不好,就是因為筆者知道自己可以撰寫等效的 perl 指令,省下學習重複的工具的心力和時間。更深入的討論可看 StackOverflow 上的相關討論串

    ruby 刻意在語言特性上師法 perl,理論上 Ruby one-liner 可以做到和 Perl one-liner 差不多的功能,但 Perl 某些在工程上不利的特性、像是弱型別、預設變數值等,對於寫 one liner 反而好用,而且 Perl 的歷史比 Ruby 久,相關的資料比較好找。另外,Perl 在大部分的類 Unix 系統上是預裝的軟體,預裝 Ruby 的機率相對少。筆者並不覺得 Ruby 本身有什麼問題,只是在寫 one liner 上沒有特別優勢。

    Perl 的語法傾向於易寫難讀,對於熟悉 Perl 的程式設計者,可以流暢地使用許多 Perl 的內隱規則寫出相當簡短的 (compact) Perl 程式。但對於團隊工作來說,過度地使用內隱規則反而不利於維護程式碼。綜合以上想法,我們將一些重用性低的小型任務用 Perl 撰寫,這時不太需要去在意工程性的議題;需要團隊合作的程式專案,則改用其他更適合的工具。在這個部分,Perl 和 Python 的功能是重疊的,讀者可自行選擇喜好的工具。

    由於 Perl 可以和系統上的命令列工具互動,在一些情境中,Perl 也可以用來代替 shell scripts。用 Perl scripts 代替 shell scripts 的好處是 Perl 在程式語言方面的功能比 Bash 或其他 shell 等來得豐富,語法上比較簡單,在字串處理上也會更容易;壞處則是 Perl scripts 會比等效的 shell scripts 寫起來長一些,讀者可視情形自行選擇適合的工具。在 Windows 上,也可用 Perl 取代內建的 Batch。

    由於 Perl 的歷史悠久,有一些軟體會用 Perl 撰寫,學習 Perl 就可以立即使用這些現有的方案。一些實例像是 BioPerl 或是 E Utilities 等,在這個兩個例子中,前者是 Perl 套件,使用者要撰寫 Perl 命令稿才能使用,後者則是應用程式,使用者不需要學習 Perl,只要把 Perl 視為一種執行環境 (runtime environment) 即可。

    相對於前述優點,Perl 在工程性較弱,對於需長期使用的應用程式,Perl 可能不是最佳的選項,這時候或許可以考慮和 Perl 特質相近的 Python 或 Ruby。因此,對於和撰寫應用程式或函式庫相關的特性,就不用急著去學,那天有需要時再補強即可。

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【支持站長】
    Buy me a coffeeBuy me a coffee
    【贊助商連結】
    【分類瀏覽】