Что эквивалентно PHP $ _POST в скрипте Perl CGI и как его использовать? - PullRequest
2 голосов
/ 31 марта 2010

У меня есть два файла 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, чтобы получить доступ к значениям формы, предоставленным пользователем?

Другими словами, какой эквивалент PHP $_POST['pid'] в Perl?

Ответы [ 4 ]

5 голосов
/ 31 марта 2010
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');
5 голосов
/ 31 марта 2010

Используйте CGI и param()

  use CGI ':standard';
  my $id    = param('id');
2 голосов
/ 31 марта 2010

Во-первых, вы должны включить предупреждений . Если бы вы сделали это, вы бы заметили, что вы должны использовать $row[1], $row[2] ... для доступа к отдельным элементам @row. @row[0] создает срез массива из одного элемента.

Во-вторых, было бы полезно отделить логику от представления с помощью шаблонного модуля, такого как HTML :: Template . Смешивание циклов while с heredoc делает код нечитаемым.

Вы можете получить доступ к значениям параметров, переданным в ваш скрипт, с помощью пакета обработки формы CGI. В настоящее время я предпочитаю использовать CGI :: Simple , а не CGI.pm , поскольку CGI::Simple имеет более разумные значения по умолчанию и не имеет багажа для генерации HTML, который поставляется с CGI.pm.

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

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

Наконец, имейте в виду, что вам по-прежнему нужно проверять 'pid', даже если в форме он указан как readonly. Я также рекомендовал бы использовать 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
}
0 голосов
/ 31 марта 2010

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...