新手上路指南


為什麼要學 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 印出. 記得使用雙面列印, 而且印了就要負責看哦!