2012年9月26日 星期三

Perl 教學 -- Perl 與 Form

Perl 教學 -- Perl 與 Form

This tutorial is copyrighted and provided as is. You are welcomed to use it for non-commercial purpose.
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

請勿轉貼
看其他教材

Perl 與 Form (I)

說明事項:
  1. 這個範例用來說明如何經由網頁上的 HTML form 表單元件來呼叫伺服器端的 perl 程式。
  2. 首先在網頁上設計表單元件,這個範例是設計一個按鈕,其原始碼如下:
    <form action="1st.pl">
    <input type="submit" value="Hello World">
    </form>
    
    基本上,該表單使得使用者在按鈕上點一下的話,它會呼叫伺服器端名為 1st.pl 的程式。如果讀者對於表單元件不熟悉的話,可以參考 Form Pages
  3. 1st.pl 的內容跟之前的 hello.pl 類似,其程式碼如下:
    #!/usr/bin/perl
    print "Content-type: text/html\n\n";
    print "<html><head><title>My First Perl Program</title></head>\n";
    print "<body><h1>Hello World</h1></body></html>\n";
    

    • Perl 的註解符號是 "#"。
    • print "string"; 也可寫成 print("string");
    • "Content-type: text/html" 是所謂的 MIME header;它的功能在於告訴瀏覽器 即將傳送過來的資料是 HTML 網頁。
    • "\n" 代表 newline。依據規定,在 MIME header 後, 必須要有兩個 "\n"。
    • 在 Perl 中, 字串 (string) 可以以雙括號 " 或單括號 ' 表示。 如 "string" 與 'string' 都代表同一個字串。 不過, "string\n" 與 'string\n' 便不同。 試試看!
    • 函數 substr(string, offset) 會將 string 位於 offset 位置之後 的子字串回傳;string 的索引位置從零開始。
      1. print substr("Hello World", 6); 會回傳 World。
      2. print substr("Hello World", -2); 會回傳字串的最後兩個字元,也就 是 ld。



Perl 與 Form 結合 (II, GET)

請輸入文字:
說明事項:
  1. 在這個範例中,我們說明如何將使用者在網頁上輸入的資料傳送到伺服器端的 程式。在 HTTP 的協定中,資料傳送的方式有兩種,一種是 GET,另一種是 POST; 在這個範例我們先說明 GET。
  2. 表單元件的原始碼如下:
    01: <form method="GET" action="2nd.pl">
    02: 請輸入文字:<input type="text" name="input">
    03: <input type="submit" value="Submit">
    04: <input type="reset" value="Clear">
    05: </form>
    
    第 01 行說明,如果使用者輸入資料之後,瀏覽器會以 GET 的方式將資料傳送給 2nd.pl;第 02 行說明,這是一個文字欄位,而使用者輸入的資料在 傳送給伺服器的程式時,該程式可以格式為 input=資料 方式來取得資料。 如果你在文字欄位上輸入 Eric,並按下 Submit,你會看到如下的畫面:

    在畫面中,請留意兩件事情:第一,在 URL 欄位中,它在程式名稱(2nd.pl)後面 加上了 ?input=Eric,它代表它利用了 GET 的方式將 input=Eric 傳送給 2nd.pl;第二,2nd.pl 將 URL 中的資料擷取出來,並顯示在網頁上, 擷取的方式如以下說明。
  3. 2nd.pl 的原始碼如下:
    #!/usr/local/bin/perl
    print "Content-type: text/plain\n\n";
    $input = $ENV{'QUERY_STRING'};
    print "$input\n";
    
    GET 的傳送方式是將資料傳送到伺服器的環境變數內,而其中代表 input=Eric 的環境變數名稱為 QUERY_STRING,所以 Perl 經由 $ENV{'QUERY_STRING'} 將名為 QUERY_STRING 的內容取出,並指定給變數 input。
  4. 除了 QUERY_STRING 的環境變數,是否還有其他的環境變數?我們 可以經由以下程式得到答案,你也可以點一下按鈕來觀察。

    #!/usr/bin/perl
    print "Content-type: text/html\n\n";
    print "AUTH_TYPE is $ENV{'AUTH_TYPE'} <br>";
    print "CONTENT_LENGTH is $ENV{'CONTENT_LENGTH'} <br>";
    print "GATEWAY_INTERFACE is $ENV{'GATEWAY_INTERFACE'} <br>";
    print "HTTP_USER_AGENT is $ENV{'HTTP_USER_AGENT'} <br>";
    print "HTTP_REFERER is $ENV{'HTTP_REFERER'} <br>";
    print "QUERY_STRING is $ENV{'QUERY_STRING'} <br>";
    print "REMOTE_ADDR is $ENV{'REMOTE_ADDR'} <br>";
    print "REMOTE_HOST is $ENV{'REMOTE_HOST'} <br>";
    print "REMOTE_IDENT is $ENV{'REMOTE_IDENT'} <br>";
    print "REMOTE_USER is $ENV{'REMOTE_USER'} <br>";
    print "REQUEST_METHOD is $ENV{'REQUEST_METHOD'} <br>";
    print "SCRIPT_NAME is $ENV{'SCRIPT_NAME'} <br>";
    print "SERVER_SOFTWARE is $ENV{'SERVER_SOFTWARE'} <br>";
    print "SERVER_NAME is $ENV{'SERVER_NAME'} <br>";
    print "SERVER_PROTOCOL is $ENV{'SERVER_PROTOCOL'} <br>";
    







Perl 與 Form 結合 (III, POST)

請輸入文字:
說明事項:
  1. 這個範例用於說明如何利用 POST 的方式傳送使用者輸入的資料,以及 perl 程式如何擷取這些資料。我們使用的表單跟前一個範例非常類似,差別只在 method 設定為 POST,而程式名稱改成 3rd.pl
  2. 若跟之前一樣,在文字欄位內輸入 Eric,則執行的畫面如下:
    其中,請特別注意畫面中 URL 欄位,並不像之前會出現 ?input=Eric 的 訊息,而且由於這個特色,許多系統的設計都採用 POST,而不採用 GET。 當然,POST 的優點不僅如此,如以下程式中所顯示的,POST 傳送給程式的資料 是經由標準輸入裝置(STDIN),因此沒有資料量的上限;反之,GET 是經由 環境變數而傳遞,因此有資料量的限制。
  3. 3rd.pl 的原始碼如下:
    #!/usr/local/bin/perl
    print "Content-type: text/plain\n\n";
    $length=$ENV{'CONTENT_LENGTH'};
    read(STDIN, $input, $length);
    print "$input\n";
    
    • 程式先經由環境變數 CONTENT_LENGTH 得知資料的總量,然後經由 標準輸入裝置讀取資料,並存放於變數 input 內。
    • 跟所有程式一樣,Perl 也內建三個標準裝置: STDIN, STDOUT, STDERR 分別 代表標準輸入、標準輸出、以及標準錯誤。




Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu

沒有留言:

張貼留言