华域联盟 perl perl的cgi高级编程介绍

perl的cgi高级编程介绍

一 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=>'[email protected]',

   -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=>'//ipc.cnhackhy.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' , '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

您可能感兴趣的文章:

本文由 华域联盟 原创撰写:华域联盟 » perl的cgi高级编程介绍

转载请保留出处和原文链接:https://www.cnhackhy.com/76836.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部