【问题标题】:Program submit buttons in Perl CgiPerl Cgi 中的程序提交按钮
【发布时间】:2015-11-17 20:47:51
【问题描述】:

我有一个类似调查的简单表单,我使用 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 ($1))/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);

【问题讨论】:

  • submit . value 不是 Perl 语法。
  • 您应该将use strict; use warnings; 添加到您的脚本顶部以及您编写的每个Perl 脚本中;它们可以帮助捕获许多简单的错误。详情请见Why use strict and warnings?
  • 哇,非常感谢。我对这门语言还很陌生,而且要求使它变得更加困难,因为我不能使用 Javascript,而且就像你说的那样,它是一种死语言。关于这段代码,我还有几个问题。虽然我现在已经对我的 $size 变量设置了限制,但是如何让表单在我的嵌套 If 语句中在提交按钮的咯咯声中生成下一个问题?看起来应该相对简单,但我卡住了。

标签: perl cgi perl-module


【解决方案1】:

使用param 方法:

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

最好为所有提交按钮使用相同的名称,因为不可能同时按下多个按钮。然后,您可以使用基于该值的调度表。

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

【讨论】:

    【解决方案2】:

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

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

    1. 在您的代码中始终包含use strictuse warnings。并解决他们将向您展示的所有问题。
    2. CGI 模块有一个param() 方法,可让您访问传递给程序的参数。使用它将使您在程序顶部丢失所有可怕的参数解析代码。
    3. 请不要使用new CGI 语法来创建新的CGI 对象。 CGI-&gt;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;
    

    【讨论】:

    • 哇,非常感谢。我对这门语言还很陌生,而且要求使它变得更加困难,因为我不能使用 Javascript,而且就像你说的那样,它是一种死语言。关于这段代码,我还有几个问题。
    • 哇。我没有说 Perl 是一种死语言。我说 CGI 是一种死技术。使用 Perl 编写 Web 应用程序有很多好方法。
    猜你喜欢
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多