Jan Eden wrote:
>
> Hi all,
>
> there must be a better way to do this. My task is to create a multiple choice
> test in HTML. First, I print the question (frage):
> ----
>     my $query = "SELECT frage_id, frage_text, antwort_text_1, antwort_text_2,
>             antwort_text_3, antwort_text_4, antwort_text_5 FROM fragen";
>     my $sth = $dbh->prepare($query);
>     $sth->execute();
>     print qq{<form action="show_multi.pl" method="post"
>                 enctype="application/x-www-form-urlencoded"
>             accept-charset="utf-8"><table>};
>     my $counter;
>     while (my ($frage_id, $frage_text, $antwort_text_1, $antwort_text_2,
>             $antwort_text_3, $antwort_text_4, $antwort_text_5)
>                 = $sth->fetchrow_array) {
>         $counter++;
>         print qq{
>             <tr>
>                 <td>
>                     Frage $counter:
>                 </td>
>                 <td>
>                     $frage_text
>                 </td>
>             </tr>};
> -----
>
> Next, the possible answers should be printed Now instead of calling each
> answer's variable explicitly, I'd like to use a loop.
>
> -----
>         foreach my $count (1..5) {
>             $antwort = "antwort_text_$count";
>             print qq{<tr>
>                 <td>
>                     <input type="checkbox" name="${frage_id}_antwort_$count">
>                 </td>
>                 <td>
>                     ${"$antwort"}
>                 </td>
>                 </tr>
>             };
>         }
>     }
>     print qq{</table><input type="hidden" name="mode" value="result" />
>             <input type="submit" name="Absenden" value="Absenden" /></form>};
> $sth->finish();
> -----

Hi Jan.

> $antwort is declared as an our variable and it holds the string
> "antwort_text_1", "antwort_text_2" etc., but the dereferencing never works. An
> empty string is printed. The string "1_antwort_1" as the name of an input
> field is generated correctly, of course.

$antwort doesn't need to be a global variable, but $antwort_text_1 .. 5 do,
as symbolic references don't work on lexical variables.

  $count = 1;
  $antwort = "antwort_text_$count";
  print ${$antwort};

prints $main::antwort_text_1 (or whatever the current package is).

perldoc perlref says:

    Only package variables (globals, even if localized) are visible to
    symbolic references. Lexical variables (declared with my()) aren't in a
    symbol table, and thus are invisible to this mechanism.

> But even if I got the dereferencing to work, this solution looks suboptimal.
> Could anyone suggest a way to loop through the different answers without using
> /no strict "refs"/, i.e. without making use of symbolic references at all?

How about this:

  while (my ($frage_id, $frage_text, @antwort) = $sth->fetchrow_array) {

    $counter++;

    print qq{
      <tr>
        <td> Frage $counter: </td>
        <td> $frage_text </td>
      </tr>
    };

    my $count;
    foreach my $antwort (@antwort) {

      $count++;

      print qq{
        <tr>
          <td> <input type="checkbox" name="$frage_id_antwort_$count"> </td>
          <td> $antwort </td>
        </tr>
      };
    }
  }

HTH,

Rob

(BTW Jan I know I owe you an email. I'm getting to it!)



-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to