21 世紀的 Perl

    前言

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

    Perl 在現代的角色

    筆者認為,即使到了 21 世紀,Perl 仍然可以學,但我們對 Perl 的視角略為調整。我們將 Perl 視為一種具有程式語言功能的命令列工具,而非一種通用型程式語言。

    在這種思維下,我們僅需先學習其中一部分的 Perl 特性,就足以滿足我們日常任務的需求;相對來說,有些特性可以暫時不學,需要時再補足即可。

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

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

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

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

    Perl 的優缺點

    在類 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 的建議用途

    綜合以上想法,我們將一些重用性低的小型任務用 Perl 撰寫,這時不太需要去在意工程性的議題;需要團隊合作的程式專案,則改用其他更適合的工具。在這個部分,Perl 和 Python 的功能是重疊的,讀者可自行選擇喜好的工具。

    由於 Perl 可以和系統上的命令列工具互動,在一些情境中,Perl 也可以用來代替 shell 命令稿。用 Perl 命令稿代替 shell 命令稿的好處是 Perl 在程式語言方面的功能比 Bash 或其他 shell 等來得豐富,語法上比較簡單,在字串處理上也會更容易。

    使用 Perl 取代 shell 的壞處則是 Perl 命令稿會比等效的 shell 命令稿寫起來長一些,讀者可視情形自行選擇適合的工具。在 Windows 上,也可用 Perl 取代內建的 Batch。

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

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

    迎接 Perl 7 的到來

    Perl 在大版本號來到 7 之後,雖然語法和 Perl 5 大抵上雷同,但會有更適合於現代的預設設置。也就是說,在盡力避免 Perl 社群分裂的前提下完成 Perl 的現代化工程。待更多 Perl 7 的資訊出現,筆者也會更新本系列文章的內容。

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Yahoo
    【追蹤本站】
    Facebook Facebook Twitter