|
第一章 cgilib例(未定稿)
by
flamephoenix
一個(gè)簡(jiǎn)單的讀取并處理表格請(qǐng)求數(shù)據(jù)的cgilib.pl例子:
#!/usr/bin/perl
sub
readGetData{ ????#
指定局部變量queryString用以保存和傳遞函數(shù)的參數(shù)
????local(*queryString) = @_ if @_;
????# 讀取環(huán)境變量QUERY_STRING的值賦給變量$queryString
????$queryString = $ENV{"QUERY_STRING"};
????return 1; }
sub readPostData{
????local(*queryString)=@_ if @_;
????local($contentLength);
????# 讀取環(huán)境變量CONTENT_LENGTH的值
????$contentLength = $ENV{"CONTENT_LENGTH"};
????# 檢查是否有數(shù)據(jù)
????if($contentLength){
????????#
從設(shè)備STDIN讀取contentLength長(zhǎng)度的字符賦給$queryString
????????read(STDIN,$queryString,$contentLength);
????} ????return 1; }
sub readData{ ????local(*queryString) = @_
if @_; ????# 讀取環(huán)境變量REQUEST_METHOD
????$requestType=$ENV{"REQUEST_METHOD"};
????# 如果請(qǐng)求方式為GET則使用函數(shù)readGetData
????# 否則如果請(qǐng)求方式為POST則使用函數(shù)readPostData
????if($requestType eq "GET"){
????????&readGetData(*queryString);
????}
????elsif($requestType eq "POST"){
????????&readPostData(*queryString);
????} ????return 1; }
sub DecodeData{ ????local(*queryString)=
@_; ????# 把加號(hào)轉(zhuǎn)換成空格
????$queryString=~s/\+/ /g;
????# 轉(zhuǎn)換十六進(jìn)制字符
????$queryString=~s/%(..)/pack("c",hex($1))/ge;
????return 1; }
sub parseData{
????local(*queryString,*formData) = @_ if @_;
????local($key,$value,$curString,@tmpArray);
????# 以&為分隔符把字符串轉(zhuǎn)換成鍵-值對(duì)
????@tmpArray = split(/&/,$queryString);
????# 在數(shù)組@tmpArray內(nèi)循環(huán)
????foreach $curString(@tmpArray){
????????# 以=為分隔符分開鍵-值對(duì)
????????($key,$value) =
split(/=/,$curString);
????????# 解碼
????????&DecodeData(*key);
????????&DecodeData(*value);
????????# 把鍵和值加到字典中
????????$formData{$key}=$value;
????} ????return 1; }
1; #end of file cgilib.pl
使用方法:
要使用此庫(kù)需含下列語(yǔ)句: #require
"cgilib.pl"; 表格數(shù)據(jù)處理: %dataDict=(); &readData(*data); &parseData(*data,dataDict); 字典數(shù)據(jù)處理:
while(($key,$value)=each(%dataDict)){
????print $key,"=",$value,"\n\n"; }
|
|