Perl Cgi 中的程序提交按钮

Program submit buttons in Perl Cgi

我有一个类似表单的简单调查,我在其中使用 Perl CGI 来执行此操作,不会使用交互式 HTML 文档。我遇到的问题是我不知道如何确定单击了哪个提交按钮,如果是,则继续下一个问题或转到上一个问题。我已经为按钮设置了值,但我不确定如何使用该值来继续下一个问题。 (我是 Perl CGI 的新手,请原谅草率的代码。谢谢)

#!c:/Perl/bin/perl.exe

use CGI;
use CGI::Carp qw(fatalsToBrowser);

if ( $ENV{'REQUEST_METHOD'} eq "POST" ) {
    $form_size = $ENV{'CONTENT_LENGTH'};
    read( STDIN, $form_data, $form_size );
} else {
    $form_data = $ENV{'QUERY_STRING'};
}

$form_data =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("C", hex ())/eg;
@fields = ( split( /&/, $form_data ) );
$size = @fields;

for ( $i = 0; $i < $size; $i++ ) {
    ( $key, $value ) = ( split( /=/, $fields[$i] ) );
    $value =~ s/[;<>\(\)\{\}\*\|'`\&$!#:"\]/\ /g;    # Syntax Highlighting fix: '
    $value =~ s/[+]/\ /g;
    $my_hash{$key} = $value;
}

my $q = new CGI;
print $q->header("text/html"), $q->start_html( -title => "Survey", -bgcolor => "blue" );

@labels = ( "Not at all", "", "Somewhat", "", "Extremely" );
@labels2 = ( "No", "Yes", "N/A" );

print $q->submit( 'prev_button', 'Prev' );
print $q->submit( 'next_button', 'Next', 'Javascript: validate_form()' );

if ( submit . value == Prev ) {
    if ( $size == 0 ) {
        $size = 0;
    } else {
        $size = $size - 1;
    }
} elsif ( submit . value == Next ) {
    if ( $size == 6 ) {
        $size = 6;
    } else {
        $size + 1;
    }
}

if ( $size == 0 ) {
    print $q->p("1. Please enter your name:");
    print $q->textfield( 'q1', '', 50, 80 );
} elsif ( $size == 1 ) {
    print $q->p("2. Did you find the information included within this web site useful?");
    print $q->radio_group( 'q2', [ '1', '2', '3', '4', '5' ], "-", 'false', \%labels );
} elsif ( $size == 2 ) {
    print $q->p("3. Is the web site easy to navigate?");
    print $q->radio_group( 'q3', [ '1', '2', '3', '4', '5' ], "-", 'false', \%labels );
} elsif ( $size == 3 ) {
    print $q->p("4. Were you able to find the information you were looking for?");
    print $q->radio_group( 'q4', [ '1', '2', '0' ], "-", 'false', \%labels2 );
} elsif ( $size == 4 ) {
    print $q->p("5. What other information would you like to be included in the web site?");
    print $q->textarea( 'q5', '', 10, 50 );
} elsif ( $size == 5 ) {
    print $q->p("6. What suggestions you might have for our website improvement?");
    print $q->textarea( 'q5', '', 10, 50 );
} elsif ( $size == 6 ) {
    print $q->p("Thank you for your input.");
}

print $q->end_html;

exit(0);

使用param方法:

if ($q->param('prev_button') eq 'Prev') {
...
if ($q->param('next_button') eq 'Next') {

最好为所有提交按钮使用相同的名称,因为不可能同时按下多个按钮。然后,您可以根据值使用分派table。

my $other_page = {  Prev => \&previous_page,
                    Next => \&next_page,
                 }->{ $q->param('submit') };
$other_page->() if $other_page;

你似乎在猜测这些东西是如何工作的。当您使用 CGI 模块时,最好先阅读 its documentation 一次或两次,然后再花更多时间尝试使用它。

关于您的代码的一些要点。

  1. 您的代码中始终包含 use strictuse warnings。并解决他们将向您展示的所有问题。
  2. CGI 模块有一个 param() 方法,可以让您访问传递给您的程序的参数。使用它将使您在程序顶部丢失所有可怕的参数解析代码。
  3. 请不要使用 new CGI 语法来创建新的 CGI 对象。 CGI->new 不容易出错。
  4. CGI 模块中的 HTML 创建方法已弃用。请考虑改用模板系统。您还可以考虑使用基于 PSGI 的解决方案而不是 CGI(这被认为是一项死技术)请参阅 CGI::Alternatives 以获取建议。

您的实际问题似乎是由代码中的某些语法错误引起的。

if ( submit . value == Prev ) {

这不是有效的 Perl。我希望它会导致将语法错误消息写入您的错误日志。由于您有两个提交按钮,您可能需要:

if ($my_hash{prev_button}) {
    ...
} elsif ($my_hash{next_button}) {
    ...
}

但是,正如其他人所说,两个提交按钮最好具有相同的名称。

你的 if ... else ... 街区也有点奇怪。这个:

if ( $size == 0 ) {
    $size = 0;
} else {
    $size = $size - 1;
}

可以简化为:

$size-- if $size != 0;

还有这个:

if ( $size == 6 ) {
    $size = 6;
} else {
    $size + 1;
}

没有做任何有用的事情。我想你想要:

if ( $size == 6 ) {
    $size = 6;
} else {
    $size = $size + 1;
}

可以简化为:

$size++ if $size != 6;