• 2969阅读
  • 2回复

CGI编程:perl [复制链接]

上一主题 下一主题
离线cai
 

只看楼主 倒序阅读 0楼 发表于: 2005-08-31


perl语言中的变量有以下五种:
  标量,指针,数组,哈希表(hash)和句柄。
一、标量
  我们先来看看标量,标量是perl语言中最简单的一种数据类型。这种数据类型的变量可以是数字,字符串,浮点数,不作严格的区分。在使用时在变量的名字前面加上一个“$”,表示是标量,相当于scalar中的第一个S。

  使用以下格式进行定义:
   $myfirst= 123;           # 数字 123  
   $mysecond="123";          # 字符串123    
   $mythird= "$myfirst,$mysecond";   # 字符串123,123
   $myforth= '$myfirst,$mysecond';   # 字符串$myfirst,$mysecond
  数字类型的标量可以使用0开头代表是8进制,用0x开头代表是16进制。例如:
   $var1= 017;             # 十进制的15
   $var2= 0xf;             # 十进制的15
  还可以使用下面的格式:
   $var3= 123_456_7;          # 1234567
  浮点数可以使用以下定义方式:
   $var4= 3.4;
   $var5= 4.3e+21;
   $var6= 234E345;

  perl中的字符串使用一个标量来表示,定义方式和c很像,但是在perl里面字符串不是用0来表示结束的。而且使用双引号和单引号定义的字符串是不一样的。使用双引号定义的字符串里面出现的变量名会进行替换,而且可以出现“\n\r\t”等控制字符。而用单引号定义的就不可以了使用反斜杠引导的控制命令了(当然还可以使用反斜杠引道单引号和反斜杠),文本会按照字符串原来的样子保存。
  但是用单引号定义可以使用多行文本,如下所示:
   $var7='这是一个使用
   多行字符串文本
   的例子';
   $var8= '\'\\';    # 字符串'\

二、数组
  在Perl中数组使用“@”引导,“@”的意义应该是相当于array中的第一个a吧(嘻嘻,猜的)。数组初始化使用()。我们可以采用如下方法初始化数组:
   @var9=(1,2,3,4,5);
  而当引用数组中的元素时则使用下面的格式:
   $var10=$var9[1];
  数组前面的引导字符变成了“$”,表示这里是引用数组中的元素。
  如果使用“@”作引导字符,那么刚才的例子就会返回数组的长度。例如:
   $length=@var9;       # 则$length会返回数组长度也就是数组的元素个数5

三、哈希表(hash)
  哈希表是一种很特别的数据结构,我在学习数据结构时见过,叫做散列(Set),在使用perl之前,我在borland C++中见过一种类似的class,也叫做Set。在JavaScript中也提供了相似的数据结构,叫做关连数组Associated Array。

  哈希表用“%”引导。定义方法如下:
   %var11=("hello"=>"哈罗","nihao"=>"你好");

  使用方法如下:
   print $var11{"hello"};  # 输出 哈罗 $var11{"nihao"}="你好";
  还可以使用下面的方法定义:
   %var12= ("hello","哈罗","nihao","你好");
  这个方法的结果与上面的结果相同,但是我还是喜欢第一种方法,而且建议你也使用第一种方法。

四、句柄

  句柄是一种特殊的数据,用来保存系统资源的指针,例如文件,目录,管道,socket等等。在最新的perl中,实际上可以不使用这种数据。句柄类型没有引导字符。一般情况下大家习惯使用大写字母来标明句柄类型。例如下面的例子打开一个文件,读出一行,然后关闭。
   open(FILEHANDLE,"test.htm");
   $templine=<FILEHANDLE>;
   close(FILEHANDLE);
  这里<>起从句柄中读出一行的作用。

五、指针
  perl里面的指针分为两种类型,一种成为软指针,另一种称为硬指针。下面将主要介绍一下硬指针。在perl里面使用“\”来生成指针。如下面的例子:
   $vavr13="hello";
   $pointerto=\$var13;
  这时$pointerto就是一个指向$var13的指针了。访问指针指向的数据可以使用下面的方法。print $$pointerto; 也就是加上一个$就可以了。perl里面的指针与c里面的不同,perl里面的指针是有引用计数的。也就是说,如果一个数据可以记住自己被几个指针引用,当没有指针引用时这个数据会自动释放内存。

来看看标量的操作符,标量可以分为两类:一类是数字,另一类是字符串。在perl中这两类数据可以相互转化,但是操作还是有区别的。

  下面先介绍数字类型的操作符:

  数字类型的运算操作符有一下几种:
  +(加),-(减),*(乘),/(除),-(取反)。
  不会的举手,好没有。

  下面讲一些难的。
  第一个是“%”(取余)。嗯,会C语言的可以退场。这个操作符的使用方法和“/”差不多,但是结果是除之后的余数。例如:
   $a=6%5;这时$a的值为1;
   $b=5%6; 这时$b的值为5。
  如果在进行求余运算时不是整数,那么四舍五入后进行运算,不可以对0求余噢!

  第二个是幂运算(**)。
  $c=2**3; 这时$c的值为8。相信我,我写了一个程序实验过的,程序如下:
   #!/user/bin/perl -w
   use strict; {
   my $a=2**3;
   print $a;
   }

  还有两种我们应该知道的运算符是“++”和“--”。“++”在自身基础上面加一,“--”在自身基础上减一。这种运算在c里面经常用的。

  数字的比较运算符有下面几个: “<”,“>”,“<=”,“>=”我想这几个我就不用解释了。再有一个就是“==”这个运算符用来对比两个数字是否相等。然后就是“!=”表示两个数字不等。
  还有一个好玩的比较运算符是“<=>”,这个运算符当左边的数字小于右边的时返回-1,相等时返回0,当左边的大于右边的时返回1。

  另外就是位操作符了,和c一摸一样。
  位与:& 位或:| 位非:~ 位异或:^ 左移:$x << 1 右移:$x >> 2
  注:不要将&用于负整数,因为PERL将会把它们转化为无符号数。

  然后要讲一讲的是赋值操作符,最基本的赋值操作符是“=”,(废话!)然后一种是“+=”表示在自身基础上面增加。例如:
   $d=3; $d+=3; 这时$d就等于6了。
  相应的还有“-=”,“*=”,“/=”,“**=”,“^=”,“&=”,“|=”,“~=”。 数字的操作符大致就有这些了。

  下面是关于字符串的操作符的介绍。两个字符串相加(连接)用“.”进行。例如:
   $e="hello "."all";
  这时$e的值为“hello all”相应的也就有“.=”运算了。
  另外还有一个运算符是x,没错,就是它。用来表示……只可意会,不可言传。
   $f="f"x5;       此时$f的值为"fffff",明白了吧?
  字符串的比较用以下的操作符进行:
   “lt”意为“小于,less than”;
   “gt”意为“大于,greater than”;
   “eq”意为“等于,equal”;
   “le”意为“小于等于,less than or equal”;
   “ge”意为“大于等于,greater or equal”;
   “ne”意为“不等于, not equal”;
   “cmp”意为“比较,返回 1, 0, or -1,compare”。
  可以看出来字符串的操作和数字的操作是相对的。
  另外对字符串可以进行“++”运算,这时将会把字符串的ascii码加一。但是"z"++却是"a","Z"++ 是"A","9"++是0,"ab99"++将会得到"ac00"。呵呵,很好玩吧?字符串是没有-,*,/等运算的。如果我们对字符串进行这些运算则表示我们要把字符串转换成数字然后进行计算。如果这个字符串是"111"还好说,如果我们强制perl把例如"aaaaa"一类的字符串进行数字运算, perl会把这些字符串转换成0。因此"aaa"--将会得到-1。很好玩是不是?呵呵,perl还有很多好玩的东西。

  对标量进行操作还可以使用下面的函数。
  第一个是length(),这个函数可以返回变量打印出来的长度。例如:
   length(23),将会返回2;
   length("hahaha"),将会返回6;
   length(1)将返回1。
  在perl5中length("你好"),将会返回4,听说在perl5.6中将不会。我没有实验过,不好说什么。
  第二个函数是chop()。这个函数将会节掉字符串中的最后一个字符,例如:
   $g="aaa";
   chop($g);
  这时$g中的值是"aa";同时chop会返回它所截下来的字符。试一试 $g="你好"; chop($g); 会发生什么?
  第三个函数是chomp(),这个函数仅仅将字符串末尾的换行符裁掉。
  第四个函数是substr()这个函数可以从一个字符串中截取一段长度的字符串并将其返回。例如:
   $h="hello all";
   $i=substr($h,3,5)
  将会从“hello all”中截取长度为5的字符串,就是"lo al"。试一试这样呢?
   $h="你们好吗?";
   $i=substr($h,3,5);
  第五个很有用的函数就是defined(),这个函数用来判断一个数据是否已经定义。在perl中,一个数据如果没有定义,那么他将会是一个叫做 undef的特殊值。 defined()是一个非常有用的函数。至少我经常用。有其是在判断cgi输入的时候。

数组是perl里面一种非常有用的东西。我们可以通过下面的方式定义数组:

   @a=("hello","great","cipher");
   @b=(1,2,3,4,5,6,7);

  @b的定义方式还可以写成下面的形式:

   @b=(1..7); #这种方式对于需要1到10000的初始值得数组真实太重要了。   
   @b=("a".."z");

  也是可以的,但是我想不出来对中国人有什么用。定义一个空数组可以用下面的方式:

   @c=();

  访问数组通过下面的方式(下标和c语言一模一样,从0开始,basic的用户要注意了):

   $b[0]=10000;

  注意这里引导符变成了$不是@。通过这个变化表示这时正在访问一个单独的数据。而不是一组数据。还可以使用多个下标,但是这时就要使用@引导符了。例如:

   @b[5,7,9]=(45,56,67);

  这种情况下,print $b[8];将会在使用了perl -w得到一个使用未定义变量的错误,其他情况下什么都不会发生。

  数组之间相互拷贝,可以用下面的方式:

   @d=@c;

  这样要比c语言简单多了。同c语言不同,perl的数组是可以动态改变大小的。因此我们可以追加,删除数组内的元素。追加一个元素可以使用这种方式:

   @c=(@c,"hello");

  perl里面有一个专门的函数用来惊醒追加操作叫做push,push的使用方法如下:

   push(@c,"hello");
   push(@c,("hello","halloha"));
   push(@c,@a);

  这里可以看到,可以给数组追加一个元素,一组元素甚至另外一个数组。另外,在perl的数组中可以放不同类型的标量。这一点在c程序员的眼中可能有点怪异,但是如 果记住perl里面的一切都是引用就可以了。或者理解成这是一个void类型的指针的数组。有了push,就一定有pop。pop就是从数组的最后取出一个元素。用法为:

   pop(@a);

  既然可以从数组的末尾加入元素,那么一定也可以从数组的开头加入元素。那么这个功能是由unshift函数提供的。用法为:

   unshift(@c,"hello");
   unshift(@c,("hello","halloha"));
   unshift(@c,@a);

  有了unshif就一定会有shift了。shift的功能是从数组的开头取出一个元素。用法为:

   unshift( @a);

  有了操作数组两端的函数那么一定也会有操作数组中间部分的函数,这个函数就是splice,splice函数有三个作用。第一个作用是向数组中间的一部分插入内容。例如:

   @d=(1..9);
   my @e=("a".."f");
   splice(@d,2,2,@e);

  将会得到12abcdef56789,注意这里是从第二个开始插入,不是从下标为2的元素开始插入的。splice的第二个功能是删除,例如在刚才的代码上面再加上:

   splice(@d,2,6);

  将可以得到1256789;splice的第三个功能就是删除到末尾。语法为:

   splice(@d,2);

  就是从第二个开始,删除到末尾。我们还应该有一个可以把整个数组合并成一个标量的函数。这个函数就是join,join有两个参数,第一个参数是合并时放在元素之间的分割符,第二个是进行操作的数组。 例如:

   my @g=(1,2,3);
   join(" ",@g);

  将可以得到“1 2 3”,还有三个函数我们昨天已经见过了,就是undef,chop和chomp。undef(@a); 的作用是把@a的内容清空。chop(@a); 的作用是把数组内每个元素的末尾去一个字符。而chomp(@a); 的作用则是把数组内的每一个元素的末尾的换行符去掉。我们还应该介绍一个函数就是scalar,这个函数取得数组的长度。例如:

   my @h=(1,2,3);
   scalar(@h);

  将可以得到3。但是我们经常不这么用,因为在将数组向标量转换时就会返回数组的长度,例如下面的操作就可以。

   my @i=(1,2,3,4);
   print @i."\n";

  将会打印出4。 好了,今天就到这里吧,最后是一个概括了今天大部分内容的程序。我写的。中间会输出很多错误信息。呵呵。

   #!/user/bin/perl -w
   use strict;
   { $|=" ";
   my @a;
   @a=(1,2,3);
   @a[4,6]=(23,34);
   #print $a[5];
   #quoted because it would cause error
   my @b;
   @b=("because","haul");
   push(@b,"grand");
   print @b;
   print "\n";
   push(@b,("puppy","kitty"));
   print @b;
   print "\n";
   push(@b,@a);
   print @b;
   print "\n";
   push(@a,@b);
   print @a;
   print "\n";
   my @c;
   @c=(1,2,3,"hello");
   print @c;
   print "\n";
   pop(@a);
   print @a;
   print "\n";
   my @d;
   @d=(1..9);
   print @d;
   print "\n";
   my @e=("a".."f");
   splice(@d,2,2,@e);
   print @d;
   print "\n";
   splice(@d,2,6);
   print @d;
   print "\n";
   }

  嘻嘻,程序很长,不过试着运行一下,全是上面所讲的内容的应用,加深一下你的印象吗。


离线cai

只看该作者 1楼 发表于: 2005-08-31


先来看看Perl中的循环结构吧。

  1:while结构

  while结构在perl中有三种形式。 第一种形式是这样的:

   #!/user/bin/perl -w
   use strict;
   {
   my $a=0;
   while(3>$a)
     {
      print $a++;
      print "\n";
     }
   }

  第二种是定语后置式。呵呵,英文好的觉得很正常了。

   #!/user/bin/perl -w
   use strict;
   {
   my $a=0;
   print $a++."\n" while(3>$a);
   }

  第三种是这个样子的,很古怪,真的很古怪。这种用法就是加上一个continue:

   #!/user/bin/perl -w
   use strict;
   {
   my $a=0;
   while(3>$a)
     {
      print "$a\n";
     }
   continue
     {
      if($a++>1) print "hello\n";
     }
   }

  这种结构会在每个while运行了一圈之后运行一遍continue的部分,然后继续进行while循环。

  2:for结构

  for结构是各种语言中都有的。perl中的for结构和c语言中的非常相近。下面是一个例子。

   #!/user/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<10;$a++)
     {
      print "$a\n";
     }
   }

  对于数组我们可以这样访问。

   #!/user/bin/perl -w
   use strict;
   {
   my @a=(1..10);
   my $counter;
   for($counter=0;$counter<@a;$counter++)
     {
      print "$a[$counter]\n";
     }
   }

  这里面出现了一句$counter<@a,记住,数组在标量情况下即@a返回的是数组的长度,这样就好懂了,是不是?

  3:foreach控制结构

  foreach控制结构很好玩的,在bsh和javascript中有一种for(in)循环和foreach很相象。其他的语言我不熟悉,不知道有没有相近的。foreach的用法可以从下面的例子得知:

   #!/user/bin/perl -w
   use strict;
   {
   my @a=(1..10);
   my $counter;
   foreach $counter (@a)
     {
      print "$counter\n";
     }
   }

  这个程序将会把@a数组中所有的元素先逐个引用给$counter,然后把$counter地值打印出来。注意,我这里说得是引用,不是赋值,perl里面的“=”实际上是在进行引用,而不是赋值,这是需要同c严格区分的。下面的例子更加好玩一点,看一看:

   #!/user/bin/perl -w
   use strict;
   {
   my @a=(1..10);
   my $counter;
   foreach $counter (@a)
     {
      $counter++;
     }
   print "@a\n";
   }

  猜一猜将会打印出什么?呵呵,是234567891011。因为,$counter是@a中每个元素的引用,所以$counter++就对@a中每个元素进行了++操作。foreach用在hash中是非常爽的。

   #!/user/bin/perl -w
   use strict;
   {
   my %a=(hello,"你好",great,"太棒了");
   my $thiskey;
   foreach $thiskey (keys %a)
     {
      print "$thiskey=>$a($thiskey)\n";
     }
   }

  将可以把hash中所有的key和value打印出来。呵呵,很好玩吧?

一种编程语言中的控制结构是控制程序流程走向的语句和语法,今天先来学学最基本的三个控制If、Unless、Until,呵呵,其实跟其他编程语言中的对应语句的用法没有大的区别,我们就通过几个例子来看一看吧。

  if是各种语言中都有的结构,但是perl的if似乎有点……那个,可称之为“定语后置”。 具体来说就是这个样子的

   #!/usr/bin/perl -w
   use strict;
   {
   my $a=3;
   print "thank god!" if($a==3);
   }

  当然这是一个很无聊的程序了,但给大家演示了perl中定语是如何后置的。其他地方if的用法同其他语言就没什么区别了。又例如下面的例子

   #!/usr/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<10;$a++)
     {
      if($a>5) print "haha\n";
     }
   }

  有了if就一定会有else,else也没有什么特别的。用法如下:

   #!/usr/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<10;$a++)
     {
      if($a>5) print "haha\n";
      else print "lala\n";
     }
   }

  perl里面有一个特别的控制语句叫做“elsif”的,注意,不是“elseif”,而是“elsif”,这个语句的作用同else if是一样的。使用可以看下面的例子。

   #!/usr/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<10;$a++)
     {
      if($a>5) print "haha\n";
      elsif($a>3) print "lala\n";
      else print "gee!\n";
     }
   }


  Unless是If的反义词,这个关键字的用法和if完全一样,但是相当于加上一个!(取非),用一个例子来说:

   #!/usr/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<0;$a++)
     {
      print "$a\n" if(!$a>5);
     }
   }

  和

   #!/usr/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<0;$a++)
     {
      print "$a\n" unless($a>5);
     }
   }

  是一样的。 我一直不太明白这个关键字有什么用。

  Until是While的反义词,就是说不执行后面的语句一直到满足条件为止。如下面的例子

   #!/usr/bin/perl -w
   use strict;
   {
   my $a;
   for($a=0;$a<0;$a++)
     {
      until($a==3)
       { print "$a\n" unless($a>5);
        $a++;
       }
     }
   }

  这一段程序打印出3,好像很无聊是吧?但是有时候会有用的。这里有一个需要注意的是在until 里面有一个$a++。没有这个就会……555,死循环了。

今天继续剩余的程序流程控制,有next、last、redo这么几个语句。next相当于c语言中的continue,就是中止本次循环的过程,开始下一次循环。我们可以参照下面 的例子来理解它:

   #!/usr/bin/perl -w
   use strict;
   {
   my $x;
   for($x=0;$x<10;$x++)
     {
      if($x==3)
         { next;}
         print "$x ";
     }
   }

   会打印出0 1 2 4 5 6 7 8 9,当到了3的时候就next了,呵呵。next还可以和标号结合使用退出某一层循环。如下面的例子。

   #!/usr/bin/perl -w
   use strict;
   {
   my $x;
   my $y;
   here:       # here是一个标号
    for($x=0;$x<5;$x++)
     {
      for($y=1;$y<3;$y++)
        { if($x==3)
           { next here; }
           print "$x ";
        }
      print "\n";
     }
   }

  将会打印 0 0 1 1 2 2 4 4,到3的时候跳过标有here标号的循环。

  last相当于c语言中的break,就是跳出循环。例如下面的代码:

   #!/usr/bin/perl -w
   use strict;
   { my $x;
   for($x=0;$x<10;$x++)
      {
       last if($x==3);
       print "$x ";
      }
   }

  将会打印0 1 2。当$x增加到3的时候就退出了。last同next一样也具有标号的功能。例如下面的代码:

   #!/usr/bin/perl -w
   use strict;
   {
   my $x;
   my $y;
   there:
    for($x=0;$x<10;$x++)
      {
       for($y=0;$y<3;$y++)
         {
          last if($x==3);
          print("$x ");
         }
       print("\n");
      }
   }

  会打印出 0 0 0 1 1 1 2 2 2,这里当$x==3的条件满足时,就会跳出标有there的循环。

  redo是一个很好玩的东西,这个家伙居然会让当前的一圈循环重新进行一次。但是我到现在都没有发现这个东西有什么用。下面的例子说明了redo的用法。

   #!/usr/bin/perl -w
   use strict;
   {
   my $x;
   for($x=0;$x<5;)
     {
      $x++;
      redo if($x==4);
      print "$x ";
     }
   }

  会打印1 2 3 5,呵呵,这个结果是很有趣的啊。当$x==3的时候,$x++结果是4,然后发生了redo,结果4就没打印出来。然后下一次循环开始了。这个时候又发生了一次$x++; 结果$x变成5了,然后打印出来。然后条件检测不通过,退出循环。

  如果把上面的循环改成

   for($x=0;$x<5;$x++)
     {
      redo if($x==4);
      print "$x ";
     }

离线cai

只看该作者 2楼 发表于: 2005-08-31


今天算是进入正题了,因为我们这个教程的名字就叫做“CGI编程”吗。在CGI模块诞生之前,写CGI程序是一件很令人自豪的事情,因为只有那么一小撮人会。但是后来CGI模块诞生了,整个世界发生了令人感到恐怖的变化,人人都可以编CGI程序了,555...。在Perl中我们使用一个名为CGI.pm的模块来进行CGI的编程,在其中提供了许多现成的东西供我们使用,下面我们通过两个简单的例子对CGI模块的基本功能有一个初步的了解。

  先来看一看一个基本的Perl-CGI程序。这个程序和我们以前见到的Perl程序有点不太一样,但是熟悉c++的朋友应该不会有问题的。

   #!/usr/bin/perl -w
   use CGI;
   {
   my $q = new CGI;
   print $q->header(),
      $q->start_html("hello perl world!"),
      $q->h1('hello perl world'),
      $q->end_html();
   }

  这里出现了一句“use CGI;”这一句是非常重要的。我们通过use这个关键字引入了CGI模块,注意一定要用大写。这里绝大部分工作都是由CGI模块来完成的。

  然后我们进行了这么一项工作:“my $q= new CGI;”这一句产生了一个新的CGI对象。new是一个新的语句,这个语句是由CGI模块提供的,Perl语言并不提供new这个语句。但是受到C++的影响,很多perl模块都提供new语句。我们可以通过new创建一个新的CGI模块。

  随后是一个很长的print语句,注意这里面用的是逗号,Perl里面可以通过逗号顺序执行一系列的语句。我们执行的第一句是“$q->header();”这一句将会产生一个http反应头,这个函数是可以使用参数的,通过不同的参数我们可以给浏览器返回不同的状态,例如下面的语句将会使浏览器以为发生了内部错误:“$q->header(500);”这里500是http respons的一个代号,代表服务器发生内部错误。

  然后下面一句是“$q->start_html("hello perl world!"),”这一句将会产生如下的Html代码:

   <html><head></head><body>

  我们还可以通过给start_html参数来进行其他的html文件head段设置。

  然后我们运行了“$q->h1('hello perl world'),”这一句可以得到如下Html代码:

   <h1>hello Perl world</h1>

  最后一句是“ $q->end_html();”这一句产生如下下代码“</body></html>”,一个Html文件就这么结束了。

  下面我们用一个例子解释CGI模块怎么处理用户的输入:

   #!/usr/bin/perl -w
   use CGI qw/:standard/;
   {
   my $cgi= new CGI;
   print $cgi->header,
      $cgi->start_html('A Simple Example'),
      $cgi->h1('A Simple Example');
      if ( $cgi->param())
        {
         print "Your name is ",
         $cgi->param('name');
        }
      $cgi->end_html();
   }

  如果在这个程序地url后面加上“?name=cyfer”就会打印出来“your name is cyfer”,呵呵。这里通过“$cgi->param("name");”这一句可以得到传递给CGI程序的参数。这个参数在没有CGI模块的时代要费多大劲才可以得到啊!555...


今天我们看看CGI.pm的两种使用模式,因为今后我们要经常和它打交道了。调用CGI模块的模式有两种,一种是面相对象方式的,另一种是面向过程的。下面的例子说明这两种调用方式,首先是面向过程的:

   !/usr/bin/perl -w
   use strict;
   use CGI;
   {
   print header(),
      start_html(),
      h1("你好");
   print end_html();
   }

  然后是面向对象方式的:

   !/usr/bin/perl -w
   use strict;
   use CGI;
   {
   my $cgi = new CGI;
   print $cgi->header(),
      $cgi->start_html(),
      $cgi->h1("你好"),
      $cgi->end_html();
   }

  这两段代码是随手写的没有经过测试,我们可以不去管这两种代码是如何实现的,仅仅知道有这么两种方式就可以了。另外,我建议使用面向对象的方式,因为面向对象方式的要比面向过程的方式效率高。

  然后我们讲一讲CGI.pm中的函数调用方式。CGI模块经常使用下面的调用方式。

   print $q->header(-type=>'image/gif',-expires=>'+3d');

  header里面的参数实际上是一个hash类型,这里面每个参数前面都有一个“-”(其意义为hypher),可能看着有点不顺眼,但是看惯了就好了。由于这些带“-”的参数是一个hash,因此我们可以使用下面的调用方式:

   print $q->header({-type=>'image/gif',-expires=>'+3d'});  #多了一个“{”

  然后是看看header()函数。header函数生成的部分是我们在浏览器里面看不到的。但是也是不能没有的。这一部分是告诉浏览器应该对返回的信息进行什么处理,做什么事情的部分。下面是几个标准的header使用的例子:

   $cgi->header("text/html"); #后面是一个标准的html文件,它是一种text文件。
   $cgi->header("image/gif"); #后面是一幅gif图。

快速回复
限100 字节
 
上一个 下一个