加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl-cgi高级

发布时间:2020-12-16 00:16:16 所属栏目:大数据 来源:网络整理
导读:一 CGI.pm中的方法(routines)调用 ?1. CGI.pm实现了两种使用方法,分别是面向对象的方式和传统的perlmodule方法的方式。 ?面向对象的方式: ? ? #!/usr/local/bin/perl -w ? ? use CGI; ? ? ? ? ? ? ? ? ? ? ? ? ? ? # load CGI routines ? ? $q = CGI-new
一 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@capricorn.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=>'http://www.capricorn.com/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',?'yes']),
? ? ? ? ? ? ? ?td(['Onions' ?,'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

?

?完!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读