我有一个简单的调查表格,我使用Perl CGI这样做,不会使用交互式HTML文档。我遇到的问题是我不知道如何确定单击了哪个提交按钮,如果是,请继续下一个问题或转到上一个问题。我已经为按钮设置了值,但我不确定如何使用该值来继续下一个问题。 (我在Perl CGI上相当新,请原谅这些邋code的代码。谢谢)
#!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);
答案 0 :(得分: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;
答案 1 :(得分:0)
你似乎在猜测这些东西是如何运作的。当您使用CGI模块时,在花费更多时间尝试使用它之前,最好先阅读its documentation一次或两次。
关于您的代码的一些观点。
use strict
和use warnings
。并解决他们将向您展示的所有问题。param()
方法,可让您访问传递给程序的参数。使用它将使您在程序顶部丢失所有可怕的参数解析代码。new CGI
语法创建新的CGI对象。 CGI->new
更不容易出错。您的实际问题似乎是由代码中的一些语法错误引起的。
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;