精通Perl(第2版)

broadviewbj發表於2015-03-23
 

精通Perl(第2版)(通往Perl大師之路必讀經典書籍,體現了一種程式設計思維,能夠幫你解決很多實際的問題

【美】brian d foy(布瑞恩·D·福瓦)著  

王興宇 劉宸宇 譯

ISBN 978-7-121-25419-2

20153月出版

定價:89.00

424

16

編輯推薦

- 探索高階的正規表示式功能

- 如何避免程式的常見安全問題

- Perl 程式的效能分析和基準測試可以讓你發現改進之處

- 清理 Perl 程式碼,使之更加直觀和易讀

- 瞭解 Perl 如何持續跟蹤軟體包內的變數

- 動態定義子程式

- 不必改動原有程式碼即可提升模組

- 使用位操作和位向量更有效地儲存更大的資料

- 學習如何檢測 Perl 中未報告的錯誤

- 深入學習日誌、資料持久化和繫結變數的魔法

內容提要

《精通Perl(第2版)》作者brian d foy 用他生動的第一人稱視角向各位讀者介紹了精彩的Perl 高階語言知識以及豐富的實戰工具與實用技巧。《精通Perl(第2版)》各章的內容相對獨立,您完全可以根據自己的興趣或需要直達你所需要的章節。

《精通Perl(第2版)》的讀者主要面對具有較多經驗的Perl 程式設計人員。閱讀本書前,建議閱讀本書的姊妹篇《Perl 語言入門》和《Perl 進階》。作者在這本書裡針對除錯、最佳化、錯誤和日誌等方面均有深入解析,也揭示了Perl 中如繫結變數、持久化儲存等各種魔法般的特性和功能的實現細節和用途。書中還對如何開發、除錯自己的模組,以及如何做出更適合使用的模組做了詳細介紹。

總之,本書可以作為讀者在向Perl 高手進階過程中的一個助力器,希望讀者能在閱讀過程中深入思考,加入自己的理解,用Perl 來完成一件件神奇的事情。

目錄

前言  vii

1  高階正規表示式  1

可讀的正規表示式/x (?#...) 1

全域性匹配3

全域性匹配錨定5

遞迴正規表示式7

重複子模式7

前後查詢19

向前查詢斷言(?=PATTERN) (?!PATTERN) 19

向後查詢斷言(?!PATTERN) (?=PATTERN) 23

除錯正規表示式26

引數-D 26

總結31

延伸閱讀31

2  安全程式設計技術 33

不良資料會毀了你的生活33

汙點檢測34

用警告代替致命錯誤36

自動汙點檢測模式37

mod_perl 37

汙點資料37

汙點檢測的副作用39

清除資料汙點40

IO::Handle::untaint 42

雜湊表關鍵字42

Taint::Util 43

用汙點資料選擇無汙點資料44

符號引用44

DBI 防禦性資料庫程式設計47

system exec 命令的列表形式50

三個引數的open 函式51

sysopen 51

限制特殊許可權52

Safe 隔間52

Safe 模組的侷限性59

娛樂一下59

總結61

延伸閱讀61

3  Perl 偵錯程式 63

避免浪費太多的時間63

世界上最好的偵錯程式64

安全地修改模組65

封裝子程式66

Perl 偵錯程式69

備選偵錯程式70

-d 啟用其他偵錯程式70

Devel::ptkdb 70

Devel::ebug 72

Devel::hdb 73

整合開發環境偵錯程式73

EPIC 74

Komodo 74

總結74

延伸閱讀75

4  Perl效能分析 77

找出罪魁禍首77

通用方法81

DBI 效能分析83

其他DBI::Profile 報告87

懶惰是美德,能否簡單點89

切換為資料庫89

Devel::NYTProf 模組92

寫一個自己的分析器92

Devel::LineCounter 模組92

效能分析測試套件93

Devel::Cover 模組94

總結96

延伸閱讀96

5  Perl基準測試 97

基準測試理論97

測量時間98

比較程式碼102

不要停止思考105

隔離環境109

處理異常值112

記憶體使用113

perlbench 工具119

總結120

延伸閱讀121

6  清理Perl程式123

好的風格123

perltidy 程式124

去除混淆126

對隱藏程式碼的解碼126

B::Deparse 對程式碼進行逆向解析129

Perl::Critic 模組131

建立我們自己的Perl::Critic 策略135

總結136

延伸閱讀136

7  符號表和Typeglob 137

軟體包變數和詞法變數137

獲取軟體包變數139

符號表141

Typeglob 143

別名146

舊程式碼中的檔案控制程式碼引數148

給匿名子程式命名149

簡單的方法151

總結152

延伸閱讀152

8  動態子程式 153

子程式作為資料153

建立與替換命名子程式157

符號引用159

遍歷子程式列表161

處理流水線163

自引用匿名子程式164

方法列表165

子程式作為引數使用165

自動載入方法170

雜湊表作為物件171

自動切分172

總結173

延伸閱讀173

9  修改和提升模組175

選擇正確的解決方案175

給作者傳送補丁175

本地修補177

接管一個模組177

分支177

從頭開始做自己的模組178

替換模組的一部分178

派生子類181

一個ExtUtils::MakeMaker 的例子184

其他例子186

封裝子程式186

總結188

延伸閱讀188

10  配置Perl程式191

不要做的事191

將配置程式碼放到獨立的檔案中193

更好的辦法194

環境變數194

特殊環境變數195

開啟額外的輸出195

命令列選項197

Perl -s 選項198

Getopt 模組199

配置檔案204

ConfigReader::Simple 204

Config::IniFiles 205

Config::Scoped 206

其他配置檔案206

具有不同名字的指令碼207

互動和非互動程式207

Perl 的配置模組209

不同的作業系統209

總結211

延伸閱讀211

11  檢測和報告錯誤 213

Perl 錯誤處理基礎213

作業系統錯誤214

子程式錯誤216

作業系統特定的錯誤218

報告模組錯誤219

分解問題220

異常222

eval 222

多層巢狀的die 223

die 中使用引用225

die 傳遞物件226

打破$@ 229

autodie 231

報告罪魁禍首233

捕獲異常237

Try::Tiny 237

TryCatch 239

多型返回值240

總結241

延伸閱讀241

12  日誌 243

記錄錯誤和其他資訊243

Log4perl 244

子程式引數246

配置Log4perl 247

持久化日誌配置251

日誌分類251

其他的Log::Log4perl 功能254

總結255

延伸閱讀255

13  資料持久化257

Perl 特有的格式257

打包257

定長記錄259

展開二進位制格式259

Data::Dumper 260

類似的模組264

Storable 模組266

凍結資料268

Storable 模組的安全問題270

Sereal 模組273

DBM 檔案278

dbmopen 函式278

DBM::Deep 模組278

Perl 所不認識的格式280

JSON 格式280

YAML 格式282

MessagePack 格式285

總結286

延伸閱讀286

14  使用Pod289

Pod 格式289

Pod 指令289

編碼291

正文元素291

轉換Pod 292

Pod 轉換程式292

Pod::Perldoc::ToToc 模組294

Pod::Simple 模組295

Pod::Simple 派生子類298

Web 伺服器中的Pod 299

測試Pod 299

檢查Pod 299

Pod 覆蓋率300

隱藏和忽略函式的Pod 覆蓋率檢查301

總結302

延伸閱讀302

15  位操作305

二進位制數305

以二進位制數方式輸出306

位運算子307

一元取反運算子(~ 308

按位與操作(&) 310

按位或操作(| 311

按位異或操作(ˆ 312

左移位(<<)和右移位(>> )運算子314

位向量314

vec 函式316

位字串的儲存318

儲存DNA 321

素數判定322

記錄事情323

總結324

延伸閱讀324

16  繫結變數的魔法 327

看起來普通的變數327

在使用者層面328

帷幕之後329

標量330

Tie::Cycle 模組330

有界整數333

自毀值334

陣列335

重新建立陣列336

一些現實中的東西340

雜湊表345

檔案控制程式碼347

總結349

延伸閱讀350

17  模組即程式351

main 入口351

回到過去352

誰在呼叫352

測試程式353

模組即測試354

建立程式釋出包359

給程式里加內容362

釋出程式366

總結367

延伸閱讀367

附錄A 延伸閱讀369

Perl 書籍369

Perl 書籍371

附錄B brian Perl 問題解決指導手冊  373

解決問題的哲學373

我的方法374

那些我做過和仍在做的蠢事378

本書模組索引381

索引385

精彩節摘

譯者序

——獻給逝去的和新生的紀念

作為譯者,總是有一些特權,比如說,可以在翻譯的書前面,用鉛字寫一些自己想說的話。當然,作為讀者,您可能不喜歡,不過,請您諒解我們激動的心情,願意的話,您可以看看我們的吐槽。

我的父親是一個傳統的老知識分子,雖然我自己並不成器,但是他一直告訴我,要我寫一些東西出來,留一些文字,因此能出版一些自己的文字一直是我心裡長久的夢想。不過,我在各種方面的積澱還遠遠不夠,所以直到現在也沒有足以稱道的文字可以出版。

在一個偶然的機會,我得到了付睿老師的委託,和劉宸宇一同接下了這本《精通Perl》的翻譯工作。雖然翻譯工作和出版自己的文字還不同,但是我想這也是我給去世的父親的一點紀念吧。

Perl 我用了有十多年了吧,這門語言基本上算是我從事網際網路行業以來第一門真正掌握和熟悉的語言了。最初是從一本薄薄的《Perl語言入門》,大約花了一週入門的。當時正值第一波的網際網路熱潮,工作方面使用Perl甚多,也陸續看過Perl方面的各種書籍,但是從來沒有想到自己會有機會翻譯一本Perl方面的書,更別說是這本經典Perl三部曲之一的《精通Perl》。

雖然現在Perl用的比較少了,但是今年Larry Wall先生來華訪問時,還是專門去朝覲了一番。然後不久,就接到了付睿老師的委託,可謂有緣。

我平時的工作比較忙,而且也組織運作著一個翻譯組:LCTTLinux中國翻譯組- ),業餘時間都佔滿了,所以當時對是否要接下翻譯工作有些猶豫。我和LCTT的核心成員之一劉宸宇(tinyeyeser)商量了一番,感覺這個事情還是很有意義的,所以我們兩個共同接下了對這本書的翻譯工作。

                                                            王興宇

我要把這本書獻給我剛出生的小天使,翻譯完交稿不到10天,她便降臨到我的世界裡,成為了我生活中不可缺少的一部分。

一直以來,我喜歡翻譯對話、評論、調侃性質的技術部落格等文章,鍾情於感受那種面對面交流的感覺;而技術書籍這種相對較為正式的翻譯,對於我來說,反而是件痛苦的事,哪怕只翻譯半本(前言、附錄及前8章)。但是當我真正深入本書,與brian d foy 正面交鋒時,我發現,這不正是我所熟悉的面對面的對話嗎?是的!不同於一般的技術書籍,大師的行文,幾乎所有的主觀句子都是以第一人稱“I”開頭,這就好像他坐在你面前,手把手講授一樣,生動、客觀、幽默、立體!因此,我和王興宇(wxy)在翻譯的時候,把大部分“I”翻譯成了“我們”,這樣既忠於作者的語境,也更貼閤中國課堂上老師的講課習慣。

馮德倫的電影《太極》裡有一句詞:“人這一輩子,幹好一件事就足夠了”。我自認為不是一個有長性的人,一件事情很難堅持做到最好,總是覺得60分及格就可以了。因此,翻譯過程中一度出現了厭煩情緒,但我很高興自己成功堅持了下來。我要感謝幾個月來,整個翻譯過程中一直陪伴我督促我的媳婦兒,她懷著身孕,每當我消沉的時候,都會在我耳邊給予

我支援和鼓勵,“翻譯完了嗎?翻譯完了嗎?趕緊翻譯啊!好好翻譯啊!”每個成功男人的背後,都有一個偉(lao)大(dao)的女人。我愛這個嘮叨的女人!

                                                               劉宸宇

Perl 作為老牌的程式語言,其成熟度和應用廣泛令人稱道,也是系統管理員和科研工作所必備的技能之一,因此,我們希望這本書的再版翻譯,能夠幫助讀者進一步掌握Perl 語言的應用,也希望能夠為開源社群反哺更多的智慧。

將來,如果有機會,我們也希望這本書能夠以某種開源方式,分享給社群,並接受社群的不斷反饋和完善,成為一本真正有生命力的書籍。

一本書的出版,其實要感謝很多人,雖然俗套,但是我們覺得依然有必要,佔用一點小小的空間感謝他們:

    感謝我們的家人的支援。

    感謝我們的同事和領導的支援。

    感謝編輯付睿老師的信任和委託。

    感謝編輯李利健老師的辛勤審校。

    感謝所有不知名的工作人員的辛勤工作。

                                            王興宇&劉宸宇

作者簡介

brian d foy是一名多產的 Perl 培訓講師和作家,其出版的 The Perl Review 幫助人們透過教育、諮詢、程式碼審查等方面來學習和使用 Perl

前言

譯者序

——獻給逝去的和新生的紀念

    作為譯者,總是有一些特權,比如說,可以在翻譯的書前面,用鉛字寫一些自己想說的話。當然,作為讀者,您可能不喜歡,不過,請您諒解我們激動的心情,願意的話,您可以看看我們的吐槽。

    我的父親是一個傳統的老知識分子,雖然我自己並不成器,但是他一直告訴我,要我寫一些東西出來,留一些文字,因此能出版一些自己的文字一直是我心裡長久的夢想。不過,我在各種方面的積澱還遠遠不夠,所以直到現在也沒有足以稱道的文字可以出版。

    在一個偶然的機會,我得到了付睿老師的委託,和劉宸宇一同接下了這本《精通Perl》的翻譯工作。雖然翻譯工作和出版自己的文字還不同,但是我想這也是我給去世的父親的一點紀念吧。

    Perl 我用了有十多年了吧,這門語言基本上算是我從事網際網路行業以來第一門真正掌握和熟悉的語言了。最初是從一本薄薄的《Perl語言入門》,大約花了一週入門的。當時正值第一波的網際網路熱潮,工作方面使用Perl甚多,也陸續看過Perl方面的各種書籍,但是從來沒有想到自己會有機會翻譯一本Perl方面的書,更別說是這本經典Perl三部曲之一的《精通Perl》。

    雖然現在Perl用的比較少了,但是今年Larry Wall先生來華訪問時,還是專門去朝覲了一番。然後不久,就接到了付睿老師的委託,可謂有緣。

    我平時的工作比較忙,而且也組織運作著一個翻譯組:LCTTLinux中國翻譯組- ),業餘時間都佔滿了,所以當時對是否要接下翻譯工作有些猶豫。我和LCTT的核心成員之一劉宸宇(tinyeyeser)商量了一番,感覺這個事情還是很有意義的,所以我們兩個共同接下了對這本書的翻譯工作。

                                                            王興宇

    我要把這本書獻給我剛出生的小天使,翻譯完交稿不到10天,她便降臨到我的世界裡,成為了我生活中不可缺少的一部分。

    一直以來,我喜歡翻譯對話、評論、調侃性質的技術部落格等文章,鍾情於感受那種面對面交流的感覺;而技術書籍這種相對較為正式的翻譯,對於我來說,反而是件痛苦的事,哪怕只翻譯半本(前言、附錄及前8章)。但是當我真正深入本書,與brian d foy 正面交鋒時,我發現,這不正是我所熟悉的面對面的對話嗎?是的!不同於一般的技術書籍,大師的行文,幾乎所有的主觀句子都是以第一人稱“I”開頭,這就好像他坐在你面前,手把手講授一樣,生動、客觀、幽默、立體!因此,我和王興宇(wxy)在翻譯的時候,把大部分“I”翻譯成了“我們”,這樣既忠於作者的語境,也更貼閤中國課堂上老師的講課習慣。

    馮德倫的電影《太極》裡有一句詞:“人這一輩子,幹好一件事就足夠了”。我自認為不是一個有長性的人,一件事情很難堅持做到最好,總是覺得60分及格就可以了。因此,翻譯過程中一度出現了厭煩情緒,但我很高興自己成功堅持了下來。我要感謝幾個月來,整個翻譯過程中一直陪伴我督促我的媳婦兒,她懷著身孕,每當我消沉的時候,都會在我耳邊給予

    我支援和鼓勵,“翻譯完了嗎?翻譯完了嗎?趕緊翻譯啊!好好翻譯啊!”每個成功男人的背後,都有一個偉(lao)大(dao)的女人。我愛這個嘮叨的女人!

                                                               劉宸宇

    Perl 作為老牌的程式語言,其成熟度和應用廣泛令人稱道,也是系統管理員和科研工作所必備的技能之一,因此,我們希望這本書的再版翻譯,能夠幫助讀者進一步掌握Perl 語言的應用,也希望能夠為開源社群反哺更多的智慧。

    將來,如果有機會,我們也希望這本書能夠以某種開源方式,分享給社群,並接受社群的不斷反饋和完善,成為一本真正有生命力的書籍。

    一本書的出版,其實要感謝很多人,雖然俗套,但是我們覺得依然有必要,佔用一點小小的空間感謝他們:

    感謝我們的家人的支援。

    感謝我們的同事和領導的支援。

    感謝編輯付睿老師的信任和委託。

    感謝編輯李利健老師的辛勤審校。

    感謝所有不知名的工作人員的辛勤工作。

                                            王興宇&劉宸宇

前言

Mastering Perl(《精通Perl》)是本系列的第三本書。第一本書《Perl 語言入門》向讀者介紹了Perl 語法的基礎部分;第二本書《Perl 進階》介紹瞭如何建立可重用的Perl 軟體;本系列的第三本書,也就是本書,將所有的相關知識進行整合,為讀者展示如何更加自如地運用Perl

本書並非所謂的小竅門合集,它體現的是關於Perl 語言程式設計的一種思考方式,也體現在你可能會遇到的包括除錯、維護、配置等實際問題中,還體現在你作為一名職業程式設計師的現實生活中。本書要帶給你的不僅僅是發現問題之術,而是為你開啟屬於你的掌控答案之道。

成為一名大師

僅有本書並不能使你成為一名Perl 大師,要想成為大師,你需要依靠自己,經過大量的Perl程式設計實踐,嘗試大量的新鮮事物,同時犯下大量的錯誤。我將幫助你的是帶你走上正確的道路,但是,成就大師之路註定是一條獨立的自主之路。作為一名Perl 大師,除了能回答他人的問題,還要能夠找到自己問題的解答。

在同業公會的黃金年代,工匠們在掌握一門手藝成為大師的過程中,實際上都遵循著一條特定的道路。他們從學徒工開始做起,不斷重複枯燥的低微工作,直到他們掌握足夠的技巧,成為更加值得信任的熟練工(journeymen)。熟練工肩負更多的責任,但仍需在公認的大師級工匠手下工作。當學到足夠的手藝後,熟練工必須生產一件“大師級作品”來證明他的技巧。如果其他大師承認了這件作品具有大師級水準,這名熟練工才能成為一名公認的工匠大師。

熟練工和工匠大師們也會四處遊歷,向其他大師學習新的技術和技巧(儘管有爭議,但這可能是熟練工的單詞中一部分是“journey——旅行”的由來)。也許是對秘密技藝或不同的方法故意有所保留,每一位工匠大師都掌握著一些其他人所沒有掌握的東西。熟練工的部分訓練內容就是向不同的大師學習。

與其他工匠大師和熟練工的交流不斷延續著工匠大師們的學習過程。工匠大師們將從其他大師那裡學來的經驗傳授給熟練工,在這個過程中,熟練工也會把自己從另一些工匠大師那裡學來的技巧帶回給這名大師。真正的大師從不停止學習。

學徒工遵循的道路影響著他所學習的內容。一個師從多位大師的學徒工可以接觸更多的授業途徑以及視角,所有這些他都可以融合成為自己的技藝方法。某一位大師身上看似古怪的東西,透過另一位大師的不同視角更新或重新定義,也許會給這名學徒工帶來另一種平衡的觀點。另外,如果這名學徒工想要學習成為一名木匠或者泥瓦匠,不同的師父會根據不同的目標來傳授技藝,這就給了這名學徒工一個機會來學習不同的程式和方法。

不幸的是,程式設計師並不處在這樣的公會系統中。大部分Perl 程式設計師都是自學Perl (作為一名Perl 講師,我對此很鬱悶),自己程式設計,從來未曾得到過良師益友的幫助。我也是這麼過來的。我買來第1 版的《Perl 語言入門》自學完以後,儘管當時Perl 已經比較常見,但我仍然是周圍人中唯一聽說過Perl 的人。之後不久,我發現了comp.lang.perl.misc,並且開始在上面回答一些我力所能及的問題。這就像是我給自己留的家庭作業。我的技術不斷進步,社群的反饋儘管有好有壞,但都非常及時迅速,我學到了更多Perl 以外的東西。最後,我找到了一個可以整日用Perl 程式設計的工作,但我仍然是公司裡唯一使用Perl 的人。這期間,我一直在comp.lang.perl.misc 上做著我的家庭作業。

偶然間,我得到了Randal Schwartz 的注意,他將我招至麾下,開啟了我的Perl 學徒之路。他邀請我參與Stonehenge Consulting Services 專案,我成為了一名Perl 講師,於是,我真正的Perl 講授工作開始了。講授意味著把自己掌握的東西解釋給別人,對於講的人來說,這是學習一門課程的最好方法。一段時間之後,我開始了關於Perl 的寫作,這與講課是類似的,不同的是,寫作需要規範的語法(大部分時候如此)和一個用於糾錯的編輯器。

於是,我所寫的這本《精通Perl》作為系列書籍的第三本,第一個問題出現了,前兩本《Perl語言入門》和《Perl 進階》我手頭都有,這兩本大概都有300 頁左右,如果需要限制在同樣的頁數,我如何將我多年的經驗全部塞進這薄薄的一本書裡呢?

一句話,我做不到。因此,我會把我認為你應該知道的都教給你,但是你仍需要學習其他的資源。正如工匠前輩們一樣,你不能只片面聽一個人的,還需要尋找其他的工匠大師,而這正是Perl 最棒的地方:每個問題都有許多不同的解決方式。其中一些大師寫就了非常棒的Perl 書籍,有和本書同一個出版社的,也有其他出版社的。因此,有些主題本書將不再重複,下面我會再談到這個問題。

成為大師意味著什麼

本書與《Perl 語言入門》和《Perl 進階》的側重點稍有不同,前兩本書更偏重於教程類,內容涵蓋Perl 語言的大部分細節,但是涉及程式設計的實踐內容只有很少一點。因此,本書有責任在這方面給予讀者更多。

相信購買本書的各位讀者都已經基本掌握了Perl ,那麼,閱讀本書將會鍛鍊你回答自我、發掘自我的能力,雖然這個過程比簡單地請教他人需要付出更多的努力,但真正的事實是,這樣在建立自身經驗的同時,避免了因為打擾別人耗費更多的精力。

雖然我沒有像Advanced Perl Programming, First Edition(《高階Perl 程式設計》,第1 版)和MasteringRegular Expressions(《精通正規表示式》)()這兩本書那樣,在書中涵蓋其他的語言,但是你自己應該學一些其他語言。這會激發你已有的Perl 知識,帶給你新的觀點,這些新觀點中一些會使你更加欣賞Perl ,而另外一些則會使你瞭解到Perl 的缺陷。

作為一名大師,你總有一天會遇到Perl 的某些缺陷。如果你沒有這樣一張列表,上面列舉著你最痛恨的關於Perl 的五件事,以及用於支援這五件事的事實,我敢說,學習Perl ,你可能做得還遠遠不夠;關於這一點,具體可以參見我的主題演講影片“My Frozen Perl 2011Keynote”()。這並不是Perl 本身的錯。所有的語言都是如此。對Perl 的精透過程就包含了對這些東西的瞭解,以及瞭解之後對Perl 的堅持,因為對於你的程式來說,Perl 的強大要遠遠比那些缺點有價值得多。正因為你能夠辯證地認知問題的兩個方面,做出明智的選擇,進而才能指導他人,而這樣的人便稱之為大師。

以上所有這些都在講如何成就大師之路,涉及工作、閱讀,以及和他人的交流。你做得越多,學得就越多。大師之路沒有捷徑。也許如你學習其他語言一樣,學Perl 時,語法學得很快,但這只是整段經歷中最小的一部分。即使你掌握了Perl 的大部分知識,你可能仍然需要花時間閱讀一些“元”程式設計書籍,這些書討論的是程式設計實踐,而不只是擺弄語法。這些書使用的也許不是Perl 語言,但為了讀懂它們,如我之前所說,你需要學習一些其他語言。作為大師,時刻保持學習。

成就大師之路需要你比學習計劃掌握得更多,比昨天的自己努力得更多,還要竭盡所能從其他人的經驗中汲取得更多。這不僅僅與你自己寫的程式碼有關,因為你還需要與許多其他作者的程式碼打交道。

這聽起來很難,但這就是成就大師之路。它值得你為之奮鬥!別放棄!祝你好運!

本書適用於哪些人

本書是《Perl 進階》的後續書籍,因此我假設你已經瞭解並適應了上一本書中的引用、物件和模組等概念。本書中有的地方我也會引用《Perl 進階》中的內容,屆時需要你重新整理一下相應的技能。

如果是直接從其他語言轉過來的,並且之前從未使用過Perl ,或者僅僅是簡單接觸過Perl,我建議你瀏覽一下《Perl 語言入門》和《Perl 進階》,以便掌握語言的基礎內容。但這樣,你可能有時會不認識來源於實踐和經驗的慣用詞彙。總之,我並不想告訴你別買這本書(嘿,我還得付房貸呢!),但這本書對你的作用可能並不如我計劃的那麼好,至少現在如此。

如何閱讀本書

我並不想編寫所謂的“保留曲目:更多Perl 功能”第三卷。我想教授給讀者屬於自己的Perl學習方法。我將帶你走上屬於你自己的成就大師之路,作為學徒,你需要依靠自己完成一些工作。有時這代表我會告訴你在Perl 文件中到哪裡去尋找答案(同時這也意味著我可以騰出地方談論一些其他話題)。

你不需要依照任何順序閱讀各章節,各章節內容並不是循序漸進的。如果某些內容你不感興趣,大可放心地直接跳過。

關於某個主題,如果你想了解更多,可以參見我在每一章末尾附上的參考引用。

你需要掌握哪些已有知識假設你已經瞭解我們所編寫的《Perl 語言入門》和《Perl 進階》中的所有內容。這裡的“我們”,指共同作者Randal SchwartzTom Phoenix 和我。

最重要的是,你應該瞭解以下主題,其中每一條都隱含了其他主題的相關知識:

 使用Perl 模組

 書寫Perl 模組

 引數引用、子程式以及檔案控制程式碼

 基本的正規表示式語法及其工作原理

 物件導向Perl

如果要討論前面書中沒有的一些內容,我會適當解釋得深一些。如果涉及前面書裡已經講過的內容,我可能會再次強調,因為它們確實很重要。

本書包括在《Perl 語言入門》中學習了Perl 的基本語法,以及在《Perl 進階》中學習了模組和團隊開發的基礎知識之後,接下來你需要學習一些Perl 術語,以及如何為使用者編寫無須幫助就能自主使用的可擴充套件應用程式。

本書會包括一些你在前兩本書中已經見過的內容,但是深度更深。正如我們在《Perl 語言入門》中說過的,有時我們會用善意的謊言來簡化細節,從而使你儘快進步,避免陷入困境。現在,是時候在困境中稍微折騰一下了。

但是,不要把我所有的話當成絕對的真理。世界上有幾百萬名Perl 程式設計師,他們都有自己的做事方法。Perl 的成就大師之路有時需要你閱讀相當數量的Perl 程式碼,即使有些你永遠也用不到。我會盡力說服你不要去幹那些我認為的傻事,但那只是我的個人觀點。因為你努力想要成為一名優秀的程式設計師,你的知識儲備永遠需要比實踐中用到的更充裕。有時我會展示一些不建議你使用的東西,但我知道,很可能你又會在其他人的程式碼裡看到它們。唉,這個世界並不完美。

程式設計並不全都是往程式碼裡新增或修改新功能。有時要抽出部分程式碼,檢測、觀察它神奇的執行過程。有時則需要你剔除不必要的程式碼。程式設計實踐並不僅僅是建立應用程式。它還涉及對程式碼的管理和爭論。我還會展示一些技術,並非用於我們的開發工作,而是用於分析。

本書不包括

經過和編輯們的討論,我們決定不再重複那些其他書本已經充分介紹過的主題。你也需要從其他大師那裡學習,我真的不想讓本書佔用你書架上不必要的空間。忽略這些主題不但讓我省了不少事,節省下來的空間還能用於其他更多的東西,一箭雙鵰。無論如何,你應該已經讀過那些書了。

本書忽略這些主題並不是說你也可以忽略學習它們,在合適的地方,我會指給你相應該看的書。我在附錄A中列出了一些書,我認為你應該在精通Perl 的路上把這些書收入你的書庫。它們都是由其他Perl 大師寫就的,每一本都有你值得學習的東西。在大多數章節最後,我還為你列出了其他一些資源。真正的大師從不停止學習。

不過,既然你已經讀到這裡了,那麼無論出於何種原因,我就簡單列出我將明確忽略的主題:Perl 的內部機制、Perl 嵌入、執行緒、最佳範例、物件導向程式設計、原始碼過濾器和海豚(這是一本關於“海豚安全(dolphin-safe)譯註1”的書)。

本書結構

對本書內容範圍以及寫作目的的介紹。

1章,高階正規表示式

進一步介紹正規表示式的特性,包括全域性匹配、環視結構(lookarounds)、可讀正規表示式,以及正規表示式除錯。

2章,安全程式設計技術

本章介紹一些如何避免程式設計問題的常用技術,包括汙點檢測(taint checking)和一些常見陷阱(gotchas)。

3章,Perl 偵錯程式

簡單介紹Perl 偵錯程式,如何寫出你自己的偵錯程式,以及如何使用第三方偵錯程式。

4章,Perl 效能分析

在你付諸行動改進Perl 程式之前,首先找出改哪裡,改什麼。

5章,Perl 基準測試

指出哪種實現方法在時間、空間以及其他指標下的表現更好,還有發現這些數值真正意義的一些注意事項。

6章,清理Perl 程式

使用Perl::Tidy 模組或Perl::Critic 模組排布別人的程式碼(或者甚至是你自己寫的程式碼),使其更具美觀性和可讀性。

7章,符號表和Typeglob

學習如何使用Perl 追蹤包變數,如何將這一機制運用於某些強大的Perl 魔法。

8章,動態子程式

實時定義子程式,幫助程式式程式設計設計轉敗為勝。摒棄迭代資料,轉而遍歷子程式列表,使你的程式更高效,更易於維護。

9章,修改和提升模組

免於編輯原來的程式碼就能修復程式碼,這樣你就能輕鬆回到原來的程式碼。

10章,配置Perl 程式

讓你的使用者不用接觸程式碼就可以配置程式。

11章,檢測和報告錯誤

學習如何讓Perl 報告錯誤,如何檢測Perl 無法報告的錯誤,以及如何將這些訊息通知給使用者。

12章,日誌

透過使用一個極其靈活而又強大的日誌工具包Log4Perl ,讓你的Perl 程式隨時向你彙報情況。

13章,資料持久化

儲存資料以備稍後其他程式使用,或供同一程式的下次執行時使用,又或者以文字方式透過網路進行傳輸。

14章,使用Pod

Perl 特有的POD 文件翻譯成其他任何你喜歡的格式,並進行測試。

15章,位操作

使用位運算子和位向量高效儲存大量資料。

16章,繫結變數的魔法

不只是使用,而是創造你自己獨有的Perl 基本資料型別,完成任何你想要的操作。

17章,模組即程式

以模組的方式編寫程式,充分利用Perl 模組的發行、安裝和測試工具的所有優點。

附錄A,延伸閱讀

探索這些資源,繼續你的Perl 學習。

附錄Bbrian Perl 問題解決指導手冊

我最流行的手把手教程可以幫你解決任何Perl 問題。跟隨教程,提高你解決問題的技巧。

本書所使用的約定

以下是本書所使用的排版約定:

斜體(Italic

表示新的術語、網址(URL)、電子郵件地址、檔名和副檔名。

等寬字型(Constant width

用於程式清單及段落中引用的程式元素,如變數名和函式名、資料庫、資料型別、環境變數、宣告和關鍵字。

等寬粗字型(Constant width bold

表示命令或由使用者輸入的文字。

示例程式碼的使用

補充材料(示例程式碼、練習等)可在下載。

本書的目的是幫助你完成工作。一般來說,如果示例程式碼是隨本書提供的,那麼你可以在你的程式和文件中使用它。你不需要與我們聯絡來獲得許可,除非你直接複製大部分的程式碼。例如,編寫程式時使用了本書中的幾段程式程式碼不需要許可。銷售或分發OReilly 書籍中例子的CD-ROM 是必須經過許可的。引用本書及本書中的示例程式碼來回答問題不需要許可。將本書中大量的示例程式碼整合到你的產品文件中則需要獲得許可。我們很感謝你在引用的時候保留出處資訊,但是不強制。出處資訊通常包括書名、作者、出版社以及國際標準圖書編號(ISBN)。例如:“《精通Perl,第2 版》,作者brian d foy (OReilly)

Copyright 2014 brian d foy978-1-449-39311-3。”

如果你在使用示例程式碼時感到超出了合理的使用範圍,或是屬於以上某種需要授權的情況,請隨時聯絡我們permissions@oreilly.com

Safarireg; Books OnlineSafari Books Online)是一個釋出來自全球技術和商業領域的頂尖作者寫的書和影片等優質內容的按需數字化圖書館。

技術專業人士、軟體開發者、網站設計師及商業和創意專業都用Safari Books Online 作為他們的主要研究、解決問題、學習和認證培訓資源。

Safari Books Online 提供了一系列產品及針對組織、政府和個人不同的定價方案,訂閱者可以訪問到成千上萬的圖書、培訓影片及出版前的手稿,這些內容都可以從出版社,如OReillyMediaPrentice Hall ProfessionalAddison-Wesley ProfessionalMicrosoft PressSamsQuePeachpit PressFocal PressCisco PressJohn Wiley SonsSyngressMorgan KaufmannIBMRedbooksPacktAdobe PressFT PressApressManningNew RidersMcGraw-HillJones BartlettCourse Technology 等資料庫中搜尋而得到,想了解更多關於Safari Books Online的資訊,請線上訪問我們。

聯絡我們

對於本書的評論或問題,請聯絡出版商。

美國:

O’Reilly Media, Inc.

1005 Gravenstein Highway North

Sebastopol, CA 95472

中國:

北京市西城區西直門南大街2 號成銘大廈C 807 室(100035

奧萊利技術諮詢(北京)有限公司

我們為本書設定了一個網頁,在該網頁中列出了勘誤表、示例和所有附加的資訊,你可以從以下網址訪問該頁面:

評論或詢問與本書相關的技術問題也可以傳送郵件到bookquestions@oreilly.com

瞭解更多關於本書、課程、會議和新聞的資訊,請訪問我們的網站:

我們的Facebook

我們的Twitter

我們的YouTube 影片:

致謝

在寫本書第1 版的那一年,很多人給了我幫助。Mastering Perl 郵件列表的讀者在我初稿期間給了我持續不斷的反饋,其中發來的大部分建議我都採納了,這些建議來自Andy ArmstrongDavid H. AdlerRenée Bauml;ckerAnthony R. J. BallDaniel BosoldAlessio BragadiniPhilippeBruhatKatharine FarahShlomi FishDeyan GinevDavid GoldenBob GoolsbyAsk Bjoslash;rnHansenJarkko HietaniemiJoseph HourcleAdrian HowardOffer KayeStefan LidmanEricMakiJoshua McAdamsFlorian MergesJason MessmerThomas NagelXavier NoriaManuelPégourié-GonnardLes PetersBill RikerYitzchak Scott-ThoennesIan SealySagar R. ShahAlberto Simotilde;esDerek B. SmithKurt StarsinicAdam TuroffDavid Westbrook Evan Zacks

還有更多的人為第1 版提交了勘誤表。我十分確信,正是他們的詳細審查始終讓我保持在正確的道路上。

Tim Bunce 在效能分析章節給了我非常友善的建議,包括DBI::Profile 模組等內容,而Jeffrey Thalhammer 則用他的Perl::Critic 模組大大地幫助了我目前的開發工作。Perrin HarkinsRob Kinyon Randal Schwartz 自始至終都在幫我錄入第1 版的手稿,我很高興選擇他們作為我的技術評審,他們的意見總是十分準確和恰當的。第2 版時,MatthewHorsfall André Philipp 的錄入工作則對我意義重大。

儘管可能會害怕我沒完沒了的滋擾,但Allison Randal 仍然為本專案提供了非凡的Perl 建議與編輯指導。還有一些來自OReilly 其他好友的幫助,他們的付出遠比一位作者創作一本書要多得多。因此,下次你碰見某一位OReilly 僱員的時候,一定要替我感謝他(她)。最後,我要感謝Perl 社群,多年來,從我成為其中一員時起,社群一直對我無比的友善、支援。有如此多偉大的程式設計師和管理員幫助我不斷成為更加優秀的程式設計師,而我希望謹以此書,同樣能夠幫助那些剛剛加入Perl 的人們。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-1470178/,如需轉載,請註明出處,否則將追究法律責任。

相關文章