侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

perl的cgi高级编程介绍

技术  /  管理员 发布于 6年前   302

一 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="https:/article/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=>'///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生成特定碱基比例的随机序列的代码
    下一条:
    详解关于php的xdebug配置(编辑器vscode)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 2024.07.09日OpenAI将终止对中国等国家和地区API服务(0个评论)
    • 2024/6/9最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 国外服务器实现api.openai.com反代nginx配置(0个评论)
    • 2024/4/28最新免费公益节点SSR/V2ray/Shadowrocket/Clash节点分享|科学上网|免费梯子(1个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2017-07
    • 2017-08
    • 2017-09
    • 2018-01
    • 2018-07
    • 2018-08
    • 2018-09
    • 2018-12
    • 2019-01
    • 2019-02
    • 2019-03
    • 2019-04
    • 2019-05
    • 2019-06
    • 2019-07
    • 2019-08
    • 2019-09
    • 2019-10
    • 2019-11
    • 2019-12
    • 2020-01
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2020-07
    • 2020-08
    • 2020-09
    • 2020-10
    • 2020-11
    • 2021-04
    • 2021-05
    • 2021-06
    • 2021-07
    • 2021-08
    • 2021-09
    • 2021-10
    • 2021-12
    • 2022-01
    • 2022-02
    • 2022-03
    • 2022-04
    • 2022-05
    • 2022-06
    • 2022-07
    • 2022-08
    • 2022-09
    • 2022-10
    • 2022-11
    • 2022-12
    • 2023-01
    • 2023-02
    • 2023-03
    • 2023-04
    • 2023-05
    • 2023-06
    • 2023-07
    • 2023-08
    • 2023-09
    • 2023-10
    • 2023-12
    • 2024-02
    • 2024-04
    • 2024-05
    • 2024-06
    • 2025-02
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客