這章講用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。但就不多說了。
這章差不多就這樣囉!
留言列表