close

這章講用PERL 寫CGI program

我對CGI program 的認知是,首先在web 中,有client 和server 的角色,在html 語法中,client 只能向

server 要求text file 也就是.html 檔,那CGI program 可以要的更多,它可以從server 那得到不只.html 的

textfile,基本上它能要求server 上的任何資源只要權限夠的話,那在client 的brower 這,brower 只會

對html 檔interpret ,不會認識perl 檔,所以一但client 從server 中要求一個.pl 檔時,server 要先對

.pl 檔parse ,然後轉成.html 檔,接著在送給client 。

 

要寫CGI program ,要先架一個apache 。

先來看一個簡單的CGI program ,長什麼樣子。

print "Content-type: text/html \n\n";

print "<HTML>\n";

print "<HEAD>\n";

print "<TITLE> CGI-Perl program </TITLE>\n";

print "</HEAD>\n";

print "<BODY>\n";

print "<CENTER> Hi, this is CGI program </CENTER>\n";

print "</BODY>\n";

print "</HTML>\n";

 

從上面的例子,我覺得說用PERL  寫CGI program ,其實就是

PERL 的output 寫得跟html 一樣。

 

那麼為什麼要用PERL 呢?

我認為是因為如果client 跟server 要做溝通的話,可能會用到

html 裡的form。有2種方式:GET 以及POST

那PERL program 怎麼拿到用GET 或者POST 的資料呢?

看一小段程式

$m = $ENV{"REQUEST_METHOD"};

if($m eq "GET")

{

       $qstr = $ENV{"QUERY_STRING"};

}

elsif($m eq "POST")

{

       read(STDIN,$qstr,$ENV{"CONTENT_LENGTH"});

}

許多傳送過來的資料,PERL 程式可以從環境變數得到。

如果是用get 傳送的話,那麼資料會放在環境變數裡的"QUERY_STRING"

如果是用post 的話,資料會放在standard input ,但是我們可以從環境變數裡

得到資料的長度。

一般而言,傳過來的資料會長成:

A=12& b = %20 &

會有= 和& 隔開

PERL 裡的split 就很好用

@name_value_pairs = split(/&/,$qstr);

($n,$v) = split(/=/,$qstr);

另外要注意的是,有些ASCI 碼無法print 出來的。會被轉成%40 ,表示hex (40)

因此我們需要把它轉成原來的字。

利用

s/%([\dA-Fa-f][\dA-Fa-f])/pack("C",hex($1))/g;

 

記得一開始PERL 程式一定要有

print "Cotent-type:/text/html\n\n";   #這是規定

我在嘗試寫CGI 程式的時候,常常會遇到internal server error 。

我的原因有2:1是program 不對,2是program 的權限不夠讓外部開啟它

要先chmod +x aaa.pl。

 

PERL 提供好用的函式庫,因為有很多東西會重複用到。

但要先打

use CGI qw(:standard :html3)

為什麼打這個我也還不是很清楚。

print header() ;        =       print "Content-type: text/html \n\n";

print start_html("hi"); =

print "<HEAD\n";

print "<TITLE>hi</TITLE>\n";

print "</HEAD>\n;

print "<BODY>\n";

 

像是

a="AA" & b="GG"...

可以利用函式把a,b 的值拿出來,但前提是要先知道有a, b 的名稱。

my($a,$b) = (param("a","b"));

最後結尾的地方打

print end_html(); = print "</BODY></HTML>\n";

 

接下來在書上的範例有介紹file locking。

lock 是2號,unlock 是8號

例如:

open(F,"myfile.dat");

flock(F,2);

....#做些事情

flock(F,8);

另外也有一些函式可以打出html 的tag。但就不多說了。

 

這章差不多就這樣囉!

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 lettice0913 的頭像
    lettice0913

    斑的家

    lettice0913 發表在 痞客邦 留言(0) 人氣()