新手上路指南


為什麼要學 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 程式

有好幾種方式:

  1. vinano 等文字檔編輯器建立一個文字檔, 裡面寫 perl 程式, 再下 perl 命令去執行這個檔案。 例如把下面的內容鍵入一個叫做 hello 的檔案:
    print "Hello, Larry Wall!\n";
    然後就可以在 shell 下用 perl hello 執行。 (Windows 使用者: 用 command.com 或 cygwin 等命令列環境執行; 用 edit 或 nodepad, 不要用 word 建檔。)
  2. 在 UNIX 或 cygwin 環境下, 可以在上述的 perl 檔案的最上面加上一特殊列, 再 開放執行權限, 即可直接在命令列下執行該檔案. 例如把下面的內容鍵入一個叫做 hello 的檔案:
    #!/usr/bin/perl
    print "Hello, Larry Wall!\n";
    注意: "#!/usr/bin/perl" 一定要在第一列, 從第一個字元開始打, 中間不可以有空白. 然後在 shell 底下做: chmod a+x hello 從此以後即可以直接把這個檔案當做命令執行: ./hello
  3. 如果你的程式很短, 可以不必建立檔案, 只要在命令列下, 直接執行 "一句話" 的 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"
  4. (不熟悉網頁設計的讀者可略過本段) 把它變成你的網頁上的 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 例如:

  1. 在命令列上,
    perl -ne 'print if m/^From:/;' < 你的信件檔
    的效果和
    grep '^From:' < 你的信件檔
    的效果一樣, 都是把 "你的信件檔" (通常是 /var/spool/mail/你的帳號 或 ~/mbox) 內以 From: 開頭的那幾列給印出來.
  2. 在命令列上,
    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 印出. 記得使用雙面列印, 而且印了就要負責看哦!


Perl 語言

  1. 新手上路
  2. 基本要素
  3. 餵資料
  4. 常用句型
  5. regexp
  6. 詳談變數
  7. 一語中的
  8. 副程式
  9. 模組
  10. 外界對話

附錄

  1. 參考資料
  2. scripting
  3. Windows
  4. 圖形介面
  5. big-5 碼