新手上路指南
為什麼要學 perl
因為 scripting language 越來越重要。 當然, scripting languages 有很多種, 筆者選擇 perl 主要是習慣及考慮歷史因素。 說不定別的 scripting language 更適合你。
取得 Perl
安裝 Linux, FreeBSD, 或是其他 *BSD 時, 裡面自然就會有 perl。
如果不敢忤逆微軟, 決定暫時先不安裝自由作業系統, 也沒關係。 請直接燒免安裝的開機光碟 knoppix。 任何版本的 knoppix 都有 perl 可用; 臺南縣網上面還有特製的 Perl on KNOPPIX。
建議 Windows 使用者最好安裝 cygwin 及上面的 perl。 你也可以單獨安裝 windows 版 perl (見下面) 但 cygwin 環境提供類似 unix 命令列的環境, 下許多指令比較方便。
其他作業系統的使用者請到 CPAN 下的 ports 目錄 根據你所使用的作業系統與硬體平臺尋找適當的版本。
執行 perl 程式
有好幾種方式:
- 用 vi 或
nano
等文字檔編輯器建立一個文字檔, 裡面寫 perl
程式, 再下 perl 命令去執行這個檔案。
例如把下面的內容鍵入一個叫做 hello 的檔案:
print "Hello, Larry Wall!\n";
然後就可以在 shell 下用perl hello
執行。 (Windows 使用者: 用 command.com 或 cygwin 等命令列環境執行; 用 edit 或 nodepad, 不要用 word 建檔。) - 在 UNIX 或 cygwin 環境下, 可以在上述的 perl
檔案的最上面加上一特殊列, 再 開放執行權限,
即可直接在命令列下執行該檔案.
例如把下面的內容鍵入一個叫做 hello 的檔案:
#!/usr/bin/perl
print "Hello, Larry Wall!\n";
注意: "#!/usr/bin/perl" 一定要在第一列, 從第一個字元開始打, 中間不可以有空白. 然後在 shell 底下做:chmod a+x hello
從此以後即可以直接把這個檔案當做命令執行:./hello
- 如果你的程式很短, 可以不必建立檔案,
只要在命令列下, 直接執行 "一句話" 的 perl
程式:
perl -e 'print "Hello, Larry Wall!\n";'
這裡的 -e 就是說要把後面那個命令列參數當做一個 perl 程式來執行. 也可以寫:
perl -e "print 'Hello, Larry Wall!';"
(後者在稍複雜的情況下就很不方便了, 但 command.com 只認得後者...) 應用實例: 某些控制字元如果不小心被印到螢幕上, 從此以後你螢幕上的文字 (連英文字母都遭殃) 就會變成亂碼. 這時只好再印另一個控制字元來解圍. 請下perl -e 'print chr(14)'
看看你的螢幕是否變亂? 再用上箭頭把剛才的指令叫出來修改, 把 "14" 改成 "15" - (不熟悉網頁設計的讀者可略過本段)
把它變成你的網頁上的 cgi 程式.
這個要看你的帳號所在的 web server 如何設定 (個人
homepage 目錄在那裡, 可否使用 cgi, cgi
程式副檔名叫什麼 ...) 這裡只以本系 penguin
帳號為例. 把下面的內容鍵入一個叫做 hello.cgi
的檔案, 放在 ~/public_html 目錄下:
#!/usr/bin/perl
print "Content-type: text/plain\n\n";
print "Hello, Larry Wall!\n";
並把它改成可執行檔:chmod a+x ~/public_html/hello.cgi"
然後你就可以在其他機器上開一個瀏覽器, 並打入這個 URL: http://penguin.im.cyut.edu.tw/~你的帳號/test.cgi 透過網路連回 penguin 看你的 (第一個?) cgi 程式. (如果把上面的 text/plain 改成 text/html 那麼你的 perl 程式印出來的資料也要跟著改成 html 檔的格式.)
作業: 把上面所說的每個例子都真的在你的機器上做一遍. 作業: 將 下一單元 的加法範例程式有七個版本, 請用 perl -e 方式執行第一版; 另外將其他六個版本先後剪貼入你自己的檔案, 各別用建文字檔的方式執行.
(不熟悉 unix 的讀者可略過本節以下部分) 以上說的都是把 perl 當做一個程式語言來看, 但是其實 perl 也可以拿來當作 filter 使用, 尤其常拿來處理 regular expression 例如:
- 在命令列上,
perl -ne 'print if m/^From:/;' < 你的信件檔
的效果和
grep '^From:' < 你的信件檔
的效果一樣, 都是把 "你的信件檔" (通常是 /var/spool/mail/你的帳號 或 ~/mbox) 內以 From: 開頭的那幾列給印出來. - 在命令列上,
perl -pe 's/\w//g' < ~/.login;
的效果和
sed 's/[a-zA-Z0-9_]//g' < ~/.login
的效果一樣, 都是把 ~/.login 檔案內的文數字與底線去掉.
當然, perl 程式也可以直接處理檔案, 不一定非從 stdin 讀入資料不可, 所以上面的 < 其實都可以省略. 有關 -n 與 -p 的意義, 請見 「常用句型」 的 「隱含迴圈」一節.
列印講義中的範例程式...借助 perl 的力量
筆者建議讀者減少列印; 如果非列印不可的話, 請將所有程式一起列印, 減少浪費空白部分.
#!/usr/bin/perl -p print "\n", "#=" x 10, " $ARGV ", "#=" x 10, "\n" if $. == 1; close ARGV if eof;
可以將上面的程式存檔叫做 concat,
並到講義的範例程式目錄 (b/pl/demo) 底下,
先刪除掉不需要列印的程式, 然後執行 ~/concat *
> ~/all
再將 ~/all 印出. 記得使用雙面列印,
而且印了就要負責看哦!
- 本頁最新版網址: https://frdm.cyut.edu.tw/~ckhung/b/pl/index.php; 您所看到的版本: April 12 2012 14:25:54.
- 作者: 朝陽科技大學 資訊管理系 洪朝貴
- 寶貝你我的地球, 請 減少列印, 多用背面, 丟棄時做垃圾分類。
- 本文件以 Creative Commons Attribution-ShareAlike License 或以 Free Document License 方式公開授權大眾自由複製/修改/散佈。