什么是Perl CGI脚本中PHP的$ _POST的等价物,我该如何使用它?

时间:2010-03-31 09:49:21

标签: php perl

我有两个Perl文件:action.pl,另一个是test.pl

action.pl有一个表单:

print $cgi->header, <<html;
<form action="test.pl" method="post">
html
while (my @row = $sth->fetchrow)
{
print $cgi->header, <<html;
ID:<input name="pid" value="@row[0]" readonly="true"/><br/>
Name: <input name="pname" value="@row[1]"/><br/>
Description : <input name="pdescription" value="@row[2]"/><br/>
Unit Price :<input name="punitprice" value="@row[3]"/><br/>
html
}
print $cgi->header, <<html
<input type="submit" value="update Row">
</form>
html

我应该在test.pl写什么才能访问用户提交的表单值?

换句话说,Perl中的PHP $_POST['pid']等同于什么?

4 个答案:

答案 0 :(得分:5)

使用CGI和param()

  use CGI ':standard';
  my $id    = param('id');

答案 1 :(得分:5)

use CGI;
my $cgi = CGI->new();

for my $p ($cgi->param) {       # loop through all form inputs
    my $val = $cgi->param($p);  # get param's value
    # ...
}

要获取'pid'输入的值,请使用:

$cgi->param('pid');

更新: 测试脚本可能如下所示:

#!/usr/bin/perl

use strict;
use warnings;
use CGI;

my $cgi = CGI->new();

printf "%sPid:%s", $cgi->header, $cgi->param('pid');

答案 2 :(得分:2)

首先,您应该开启warnings。如果你这样做了,你会注意到你应该使用$row[1]$row[2] ...来访问@row的各个元素。 @row[0]创建单个元素数组切片。

其次,通过使用HTML::Template这样的模板模块,您可以从逻辑分离中获益。将while循环与heredoc混合在一起会产生无法读取的代码。

您可以使用CGI表单处理包访问传递给脚本的参数值。现在,我更倾向于使用CGI::Simple而不是CGI.pm,因为CGI::Simple具有更加默认的默认值,并且没有CGI.pm附带的HTML生成行李。

use strict; use warnings;
use CGI::Simple;

my $cgi = CGI::Simple->new;
my $pname = $cgi->param('pname');

最后,请记住,即使在表单中将其指定为readonly,您仍需要验证“pid”。我还建议使用CGI::Application为各种操作提供处理程序,而不是为每个操作提供不同的脚本。

这是一个简单的例子:

#!perl

use strict; use warnings;
use CGI::Simple;
use HTML::Template;

my $cgi = CGI::Simple->new;

# For demo purposes only. I would use CGI::Application
$cgi->param ? process_form($cgi) : show_form($cgi);

sub process_form {
    my ($cgi) = @_;

    print $cgi->header('text/plain'),
        sprintf("%s : %s\n",
            $cgi->param('pid'),
            $cgi->param('pname'),
        )
    ;
    return;
}

sub show_form {
    my ($cgi) = @_;
    my $tmpl = HTML::Template->new(scalarref => template() );
    $tmpl->param(
        PRODUCTS => [
            { PID => '1234', PNAME => 'Widget' },
            { PID => '4321', PNAME => 'Wombat' },
        ]
    );
    print $cgi->header, $tmpl->output;
    return;
}

sub template {
    return \ <<EO_TMPL;
<!DOCTYPE HTML>
<html><head><title>Test</title></head>
<body>
<TMPL_LOOP PRODUCTS>
<form method="POST">
<p><input name="pid" readonly="1" value="<TMPL_VAR PID>">
<input name="pname" value="<TMPL_VAR PNAME>"><input
type="submit" value="Update"></p></form>
</TMPL_LOOP>
</body>
</html>
EO_TMPL
}

答案 3 :(得分:0)

从CGI.pm作为替代。

FETCHING THE PARAMETER LIST AS A HASH:
           use CGI;
           my $params = $q->Vars;
           print $params->{'address'};

           my @foo = split("\0",$params->{'foo'});
           my %params = $q->Vars;