2015-11-17 3 views
0

У меня есть простая форма опроса, в которой я использую Perl CGI, поэтому никаких интерактивных HTML-документов не будет использоваться. Проблема, с которой я сталкиваюсь, заключается в том, что я не знаю, как определить, какая кнопка отправки нажата, и если да, переходите к следующему вопросу или переходите к предыдущему вопросу. Я установил значения для кнопок, но я не уверен, как использовать это значение, чтобы перейти к следующему вопросу. (. Я довольно новое в Perl CGI, пожалуйста, простите за неряшливый код спасибо)Кнопки отправки программ в 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); 
+0

'представить. value' не является синтаксисом Perl. – choroba

+3

Вы должны добавить 'use strict; использовать предупреждения, 'на вершине вашего скрипта и на каждый скрипт Perl, который вы когда-либо писали; они могут помочь поймать множество простых ошибок. См. [Зачем использовать строгие предупреждения и предупреждения?] (Http://stackoverflow.com/questions/8023959/why-use-strict-and-warnings) для деталей. – ThisSuitIsBlackNot

+0

Wow Большое спасибо. Я довольно новичок в языке, и требования делают его еще более сложным, потому что я не могу использовать Javascript и снова, как вы сказали, это мертвый язык. У меня есть еще несколько вопросов относительно этого кода. Хотя я установил ограничения на переменную $ size, как мне получить форму для создания следующего вопроса в моем вложенном операторе If в cluck кнопки отправки? Похоже, это должно быть относительно просто, но я застреваю. – user3600460

ответ

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; 
0

Вы, кажется, довольно угадываете, как много работает этот материал. Поскольку вы используете модуль CGI, вероятно, было бы неплохо прочитать its documentation один или два раза, прежде чем тратить больше времени на его использование.

Некоторые вопросы о вашем коде.

  1. В вашем коде всегда есть use strict и use warnings. И исправить все проблемы, которые они вам покажут.
  2. Модуль CGI имеет метод param(), который дает вам доступ к параметрам, переданным вашей программе. Использование этого позволит вам потерять весь этот ужасный код синтаксического анализа в верхней части вашей программы.
  3. Пожалуйста, не используйте синтаксис new CGI для создания нового объекта CGI. CGI->new гораздо меньше подверженных ошибкам.
  4. Методы создания HTML в модуле CGI устарели. Вместо этого попробуйте использовать систему шаблонов. Вы также можете рассмотреть решение на основе 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; 
+0

Wow Большое спасибо. Я довольно новичок в языке, и требования делают его еще более сложным, потому что я не могу использовать Javascript и снова, как вы сказали, это мертвый язык. У меня есть еще несколько вопросов относительно этого кода. – user3600460

+0

Woah. Я не говорил, что Perl был мертвым языком. Я сказал, что CGI - это мертвая технология. Существует множество хороших способов написания веб-приложений с использованием Perl. –

 Смежные вопросы

  • Нет связанных вопросов^_^