从perl中的文本字段中获取价值

时间:2013-09-05 11:54:46

标签: perl cgi

      print $q->textfield(
            -name => 'UserName',
            -value =>'JACOB',
            -size  => 30,
            -maxlength =>50,
          ); 
     my $User =$q->param('UserName');

此代码不读取文本字段中的值。 这有什么问题?

1 个答案:

答案 0 :(得分:2)

问题在于您对CGI的理解以及构建Web应用程序的方式。

以最简单的形式,使用CGI模块可以为您提取的一些参数(通常是GET查询字符串或一些POST数据)调用CGI脚本。完成后,您可以打印一些对该请求的响应。

一个更复杂的表单从HTTP方法和/或可用参数中计算出来,如果它已经被自己调用,或者如果之前没有用户。在这种情况下,通常会打印出空白表格。当用户将该表单提交回脚本时,脚本可以从查询中提取所需数据:

  

用户:嘿,请接受此请求:

GET /script.pl
     

Script1:哦,没有参数☹......好的,请收到这个:

Content-type: text/html

<form action="/script.pl" method="post">
  <input name="foo" type="text"/>
  <input name="age" type="text"/>
  <button type="submit>Submit</button>
</form>
     

用户:好的,让我填写一下表格:

POST /script.pl

foo=Foofle+Barbar&age=42
     

Script2:哦,好的,你给了我foo参数。让我回答:

Content-type: text/html

<p>Great, your name is <i>Foofle Barbar</i>! You are 42 years old!</p>

HTTP和扩展CGI是无状态 - 您必须在每个请求中携带所有重要信息。此外,每次调用CGI脚本时,都会获得该脚本的新实例(除非您使用某些技术)。

因此,您应该编写类似

的代码
if (my $User = $q->param('UserName')) {
  print "hello, $User!\n";
} else {
  print $q->textfield( ... );
}

甚至更好:

if ($q->request_method() eq 'POST') 
  print "hello, ", $q->param('UserName'), "!\n";
else {
  print $q->textfield( ... );
}

一种常见的技术是包含随每个请求一起传输的隐藏字段。这可以用来确定脚本的状态。但这确实是Cookie的用途。