perl的cgi高级编程介绍
发布时间:2022-10-04 23:41:28
一 CGI.pm中的方法(routines)调用
1. CGI.pm实现了两种使用方法,分别是面向对象的方式和传统的perlmodule方法的方式。
面向对象的方式:
#!/usr/local/bin/perl -w
use CGI; # load CGI routines
$q = CGI->new; # create new CGI object
print $q->header, # create the HTTP header
$q->start_html('hello world'), # start the HTML
$q->h1('hello world'), # level 1 header
$q->end_html; # end the HTML
传统的module方法的方式:
#!/usr/local/bin/perl
use CGI qw/:standard/; # load standard CGI routines
print header, # create the HTTP header
start_html('hello world'), # start the HTML
h1('hello world'), # level 1 header
end_html; # end the HTML
2. CGI.pm中的方法。
CGI.pm中的方法,通常有很多的参数,所以一般我们使用命名参数的方式来调用,例如:
print $q->header(-type=>'image/gif',-expires=>'+3d');
命名参数的值可以为scalar或array reference类型,例如:
$q->param(-name=>'veggie',-value=>'tomato');
$q->param(-name=>'veggie',-value=>['tomato','tomahto','potato','potahto']);
3. CGI.pm中的html元素(html shortcuts)方法
所有的html的元素(例如h1,br等)在CGI.pm中都有对应的方法,这些方法根据需要动态的生成,且都包含2个参数,第一个参数为hash类型,对应html元素的属性,第二个参数的string类型,对应html元素的内容。例如html中的h1对应的方法为h1( ):
Code Generated HTML
---- --------------
h1() <h1>
h1('some','contents'); <h1>some contents</h1>
h1({-align=>left}); <h1 align="LEFT">
h1({-align=>left},'contents'); <h1 align="LEFT">contents</h1>
有时你想自己处理元素的开始和结尾,则可以使用start_tag_name和end_tag_name,例如
print start_h1,'Level 1 Header',end_h1;
有的时候start和end方法没有被自动生成,需要显示的指定,例如:
use CGI qw/:standard *table start_ul/;
用来自动生成start_table,end_table,start_ul和end_ul方法。
另一个实例:
print a({-href=>'fred.html',-target=>'_new'}, "Open a new frame");
<a href="fred.html",target="_new">Open a new frame</a>
二 CGI.pm中获取cgi的参数
@names = $query->param #get all params
@values = $query->param('foo'); #get param foo as list
$value = $query->param('foo'); #get param foo as scalar
param()获取参数的结果可以为scalar或array类型,例如当参数的结果来自多选的scrollinglist的时候就为array类型。如果参数的值在querystring中没有给定("name1=&name2="),param()将返回emptystring。如果参数在querystring中根本不存在,则param()则返回undef或emptylist。当参数为多个值时querystring中写法为var1=value1&var1=value2&var1=value3.
三 header and start_html
1. header指定html的header,例如
print header; # 返回默认的type:text/html
print header('image/gif'); #设定type为:image/gif
print header('text/html','204 No response');
$cookie1 = $q->cookie(-name=>'riddle_name', -value=>"The Sphynx's Question");
$cookie2 = $q->cookie(-name=>'answers', -value=>\%answers);
print header(-type=>'image/gif',
-nph=>1,
-status=>'402 Payment required',
-expires=>'+3d',
-cookie => [$cookie1,$cookie2] ,
-charset=>'utf-7',
-attachment=>'foo.gif',
-Cost=>'$2.00');
其中-type,-status,-expires,-cookie为可以设别的参数,其他的命名参数都被转化为html header属性。
-expires的值可以为:
+30s 30 seconds from now
+10m ten minutes from now
+1h one hour from now
-1d yesterday (i.e. "ASAP!")
now immediately
+3M in three months
+10y in ten years time
Thursday, 25-Apr-1999 00:40:33 GMT at the indicated time & date
2. start_html 创建页面的顶层元素<html><header</header><body>
例如:
print start_html(-title=>'Secrets of the Pyramids',
-author=>'fred@jbxue.org',
-base=>'true',
-target=>'_blank',
-meta=>{'keywords'=>'pharaoh secret mummy',
'copyright'=>'copyright 1996 King Tut'},
-style=>{'src'=>'/styles/style1.css'},
-BGCOLOR=>'blue');
或者:
print start_html(-head=>[
Link({-rel=>'shortcut icon',href=>'favicon.ico'}),
meta({-http_equiv => 'Content-Type',-content=> 'text/html'})
]
);
在header中加入javascript的例子:
$query = CGI->new;
print header;
$JSCRIPT=<<END;
// Ask a silly question
function riddle_me_this() {
var r = prompt("What walks on four legs in the morning, " +
"two legs in the afternoon, " +
"and three legs in the evening?");
response(r);
}
// Get a silly answer
function response(answer) {
if (answer == "man")
alert("Right you are!");
else
alert("Wrong! Guess again.");
}
END
print start_html(-title=>'The Riddle of the Sphinx',
-script=>$JSCRIPT);
print $q->start_html(-title=>'The Riddle of the Sphinx',
-script=>{-type=>'JAVASCRIPT',
-src=>'/javascript/sphinx.js'}
);
print $q->start_html(-title=>'The Riddle of the Sphinx',
-script=>[
{ -type => 'text/javascript',
-src => '/javascript/utilities10.js'
},
{ -type => 'text/javascript',
-src => '/javascript/utilities11.js'
},
{ -type => 'text/jscript',
-src => '/javascript/utilities12.js'
},
{ -type => 'text/ecmascript',
-src => '/javascript/utilities219.js'
}
]
);
在header中使用css的例子:
use CGI qw/:standard :html3/;
#here's a stylesheet incorporated directly into the page
$newStyle=<<END;
<!--
P.Tip {
margin-right: 50pt;
margin-left: 50pt;
color: red;
}
P.Alert {
font-size: 30pt;
font-family: sans-serif;
color: red;
}
-->
END
print header();
print start_html( -title=>'CGI with Style',
-style=>{-src=>'https://www.jb51.net/style/st1.css',
-code=>$newStyle}
);
print h1('CGI with Style'),
p({-class=>'Tip'},
"Better read the cascading style sheet spec before playing with this!"),
span({-style=>'color: magenta'},
"Look Mom, no hands!",
p(),
"Whooo wee!"
);
print end_html;
四 url
$full_url = url(); # http://your.host.com/path/to/script.cgi
$full_url = url(-full=>1); # http://your.host.com/path/to/script.cgi
$relative_url = url(-relative=>1); #script.cgi
$absolute_url = url(-absolute=>1); #path/to/script.cgi
$url_with_path = url(-path_info=>1);
$url_with_path_and_query = url(-path_info=>1,-query=>1);
$netloc = url(-base => 1); #http://your.host.com
五 CGI.pm中的html元素方法的特殊用法
如果元素的第二个参数为list类型,则会被分解,例如:
print ul(
li({-type=>'disc'},['Sneezy','Doc','Sleepy','Happy'])
);
相当于:
<ul>
<li type="disc">Sneezy</li>
<li type="disc">Doc</li>
<li type="disc">Sleepy</li>
<li type="disc">Happy</li>
</ul>
例如table可以写为:
print table({-border=>undef},
caption('When Should You Eat Your Vegetables?'),
Tr({-align=>'CENTER',-valign=>'TOP'},
[
th(['Vegetable', 'Breakfast','Lunch','Dinner']),
td(['Tomatoes' , 'no', 'yes', 'yes']),
td(['Broccoli' , 'no', 'no', 'yes']),
td(['Onions' , 'yes','yes', 'yes'])
]
)
);
六 CGI.pm中非标准的html元素方法
print comment('here is my comment'); #generates an HTML comment (<!-- comment -->)
因为与perl方法冲突,所以大写的:
Select
Tr
Link
Delete
Accept
Sub
其他特殊的html元素方法:start_html(), end_html(), start_form(), end_form(), start_multipart_form() and all the fill-out form tags。
七 CGI.pm中的form相关
1 start_form 和start_multipart_form
print start_form(-method=>$method,
-action=>$action,
-enctype=>$encoding);
<... various form stuff ...>
print end_form;
-or-
print start_form($method,$action,$encoding);
<... various form stuff ...>
print end_form;
如果没有指定method,action,enctype,默认地为:
method: POST
action: this script
enctype: application/x-www-form-urlencoded for non-XHTML
multipart/form-data for XHTML, see multipart/form-data below.
当使用start_form的时候,enctype为application/x-www-form-urlencoded,如果需要新式的xhtml,则需要使用start_multipart_form,此时enctype为multipart/form-data。
更多内容请参考:cgi man page http://search.cpan.org/~markstos/CGI.pm-3.60/lib/CGI.pm


猜你喜欢
- 这篇文章主要介绍了python修改文件内容的3种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 1. desc 命令 格式: desc tablename columnname 例子: desc `table` `mid` desc `
- 0. 前言这几天在写软件工程课设,题目是:设计一款疫苗管理系统,于是用PyQT5写GUI,MySQL做数据库写了一个demo出来。做完之后,
- “表情包”是当前社交软件上不可或缺的交流方式,难以用文字表达的意思,发一个“表情包”,对方就能心领神会。下面是小派制作的一个表情包,准确地讲
- 前言我们在往期对matplotlib.pyplot()方法学习,到现在我们已经会绘制折线图、柱状图、散点等常规的图表啦(往期的内容如下,大家
- numpy矩阵数值太多不能全部显示,可以运行以下命令令全部数值展示出来np.set_printoptions(threshold='
- 目录什么是索引?最左前缀匹配原则如何计算 key_len索引优化创建索引规范什么是索引?数据库索引是一种数据结构,它以额外的写入和存储空间为
- 测试环境Python 3.6Win10代码实现#!/usr/bin/env python 3.4.0#-*- encoding:utf-8
- Python中使用threading.Condition交替打印两个字符的程序。这个程序涉及到两个线程的的协调问题,两个线程为了能够相互协调
- 循环语句(有两种):while 语句for 语句while 语句:问题:输入一个整数n,让程序输出n行的:hello
- opencv读取图像为b,g,r方法,比如img = cv2.imread("xx.jpg")cv2.imshow(&q
- 我们在开发过程中,有时候需要把float,int型等数字作为金额类型数字显示会出现很多问题,比如float会显示成 965868.45999
- 99bill: 1.md5.asp 代码如下:<% '''''''&
- 国 * 公司安全团队开发出利用赛门铁克数据库安全与审计(SDSA)设备监视数据库的一系列客户化的政策。他们是如何在已有安全策略基础上做优
- 先说点题外话,我一开始想使用Sina Weibo API来获取微博内容,但后来发现新浪微博的API限制实在太多,大家感受一下:只能获取当前授
- python中的Reportlab模块reportlab模块是用python语言生成pdf文件的模块安装:pip install repor
- Pandas count()与values_count()用法count()values_count()在指定的统计的列名上结果多了该列:对
- // 执行AJAX请求的通用函数//带一个参数,是包含一系列选项的对象function ajax(options){//如果用户没有提供某个
- 前言本文主要给大家介绍了关于python中用Future对象回调别的函数的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的
- 来自Six Revisions的一篇文章,作者对一些主流的浏览器进行了测试比较,测试主要针对以下几个方面进行:1.JavaScript执行速