2011-05-25 121 views
1

我试图根据使用CGI的迭代打印表单中的字段。是否可以在CGI打印语句中嵌套一个for循环?我不断收到一个语法错误的for循环线...在cgi中使用for循环打印

print $survey->Tr(
      $survey-td(
       $survey->startform(name=>'survey', method => 'POST', action => 'survey.cgi'), 
       for ($i=0; $i < $size; $i++){ 
        $survey->hidden(name=>"q$i", value => "currentQ[q$i]"), 
        $survey->submit(name=>'direction', value =>'Previous'), 
        $survey->endform(), 
       } 
       $survey->startform(name=>'survey', method=>'POST', action=>'survey.pl.cgi'), 
       $survey->submit(name=>'direction', value =>'Next'), 
      ), 
     ), 
+1

's/$ survey-td/$ survey-> td /'? – mob 2011-05-25 15:11:53

+0

«Tr»»⇒«tr'»。 «'-td'»⇒«' - > td'»。 «'$ i = 0;'»⇒«'我的$ i = 0;'»。 ('$ i = 0; $ i <$ size; $ i ++);''⇒«'为我的$ i(0 .. $ size-1);'»。第一个'startform'需要在循环中。最后一个'startform'需要一个匹配的'endform'。 – ikegami 2011-05-25 19:10:50

+0

请停止使用肮脏的旧CGI.pm.改用现代和干净的网络引擎,例如[舞者](http://www.perldancer.org/)或[Mojolicious](http://mojolicious.org/)。 – dolmen 2012-08-31 10:22:04

回答

2

号相反,你应该推动所有项目上的数组(提前制作的父元素),然后通过数组作为论据。

0

有点。您可以使用do嵌入for

print $survey->tr(
    $survey->td(
     do { 
     my @forms; 
     for my $i (0..$size-1) { 
      push @forms, $survey->form(
       { name=>'survey', method => 'POST', action => 'survey.cgi' }, 
       $survey->hidden(name=>"q$_", value => "currentQ[q$_]"), 
       $survey->submit(name=>'direction', value =>'Previous'), 
      ); 
     } 
     @forms 
     }, 
     $survey->form(
      { name=>'survey', method=>'POST', action=>'survey.pl.cgi' }, 
      $survey->submit(name=>'direction', value =>'Next'), 
    ), 
    ), 
); 

它可能更容易预先计算的内部零件,虽然。

my @forms; 
for my $i (0..$size-1) { 
    push @forms, $survey->form(
     { name=>'survey', method => 'POST', action => 'survey.cgi' }, 
     $survey->hidden(name=>"q$i", value => "currentQ[q$i]"), 
     $survey->submit(name=>'direction', value =>'Previous'), 
    ); 
} 

push @forms, $survey->form(
    { name=>'survey', method=>'POST', action=>'survey.pl.cgi' }, 
    $survey->submit(name=>'direction', value =>'Next'), 
); 

print $survey->tr($survey->td(@forms)); 

如果你确实想拥有for在中间,你可以使用startXXXendXXX

print $survey->starttr(); 
print $survey->starttd(); 
for my $i (0..$size-1) { 
print  $survey->form(
       { name=>'survey', method => 'POST', action => 'survey.cgi' }, 
       $survey->hidden(name=>"q$i", value => "currentQ[q$i]"), 
       $survey->submit(name=>'direction', value =>'Previous'), 
      ); 
} 
print  $survey->form(
       { name=>'survey', method=>'POST', action=>'survey.pl.cgi' }, 
       $survey->submit(name=>'direction', value =>'Next'), 
      ); 
print $survey->endtd(); 
print $survey->endtr(); 

最后,map整齐地结合dofor

print $survey->tr(
    $survey->td(
     (map { 
     $survey->form(
      { name=>'survey', method => 'POST', action => 'survey.cgi' }, 
      $survey->hidden(name=>"q$_", value => "currentQ[q$_]"), 
      $survey->submit(name=>'direction', value =>'Previous'), 
     ); 
     } 0..$size-1), 
     $survey->form(
      { name=>'survey', method=>'POST', action=>'survey.pl.cgi' }, 
      $survey->submit(name=>'direction', value =>'Next'), 
    ), 
    ), 
);