Аскер говорит:
Я также хочу, чтобы кадр существовал только после того, как результат будет сгенерирован / напечатан.
Это усложняет задачу, несмотря на то, что CGI.pm поддерживает фреймы. Вы не указали, почему хотите использовать набор фреймов, поэтому вам придется решить, стоит ли использовать подход с набором фреймов.
Вам необходимо использовать условные выражения и дополнительную информацию для управления тем, что выводится, когда: при печати формы запроса, при печати набора кадров и при печати отдельных кадров. Хитрость заключается в том, чтобы вывести набор фреймов в нужное время с фреймами, указанными назад в скрипте с помощью pathinfo, чтобы указать, какой HTML / фрейм вывести.
Во-первых, о поддержке кадров CGI.pm можно узнать здесь:
Эффективно использовать кадры может быть сложно. Чтобы создать правильный набор фреймов, в котором запрос и ответ отображаются рядом, необходимо разделить сценарий на три функциональных раздела. Первый раздел должен создать объявление и выйти. Второй раздел отвечает за создание формы запроса и направление ее в один фрейм. Третий раздел отвечает за создание ответа и направление его в другой фрейм.
Я пытался изменить http://stein.cshl.org/WWW/CGI/examples/frameset.txt, чтобы попытаться сделать то, что вы хотите сделать, но Я не / не могу это проверить (без CGI. пм сервер легко доступен). Я серьезно сомневаюсь, что это будет работать без некоторой отладки. Но, надеюсь, это дает вам основную идею работать с ним. Сначала изучите http://stein.cshl.org/WWW/CGI/examples/frameset.txt, а затем посмотрите мои изменения ниже:
#!/usr/local/bin/perl
### UNTESTED CODE ###
use CGI;
$query = new CGI;
print $query->header;
$TITLE="Frameset Example";
# We use the path information to distinguish between calls
# to the script to:
# (1) create the frameset
# (2) create the query form
# (3) create the query response
$path_info = $query->path_info;
# If no path information is provided, then we create
# print query form ###new####
# a side-by-side frame set ###old###
if (!$path_info) {
#&print_frameset; ###old###
&print_html_header; ###new###
&print_query ###new###
&print_end; ###new###
exit 0;
}
# If response path ###new###
if ($path_info=~/response/) { ###new###
&print_frameset; ###new###
exit 0; ###new###
} ###new###
# If we get here, then we either create the query form
# or we create the response.
&print_html_header;
#&print_query if $path_info=~/query/; ###old###
#&print_response if $path_info=~/response/; ###old###
&print_query if $path_info=~/frame-query/; ###new###
&print_response if $path_info=~/frame-response/; ###new###
&print_end;
# Create the frameset
sub print_frameset {
$script_name = $query->script_name;
print <<EOF;
<html><head><title>$TITLE</title></head>
<frameset cols="50,50">
<!--frame src="$script_name/query" name="query"--> <!--###old###-->
<!--frame src="$script_name/response" name="response"--> <!--###old###-->
<frame src="$script_name/query" name="frame-query"> <!--###new###-->
<frame src="$script_name/response" name="frame-response"> <!--###new###-->
</frameset>
EOF
;
exit 0;
}
sub print_html_header {
print $query->start_html($TITLE);
}
sub print_end {
print qq{<P><hr><A HREF="../index.html" TARGET="_top">More Examples</A>};
print $query->end_html;
}
sub print_query {
$script_name = $query->script_name;
print "<H1>Frameset Query</H1>\n";
#print $query->startform(-action=>"$script_name/response",-TARGET=>"response"); ###old###
print $query->startform(-action=>"$script_name/response"); ###new###
print "What's your name? ",$query->textfield('name');
print "<P>What's the combination?<P>",
$query->checkbox_group(-name=>'words',
-values=>['eenie','meenie','minie','moe']);
print "<P>What's your favorite color? ",
$query->popup_menu(-name=>'color',
-values=>['red','green','blue','chartreuse']),
"<P>";
print $query->submit;
print $query->endform;
}
sub print_response {
print "<H1>Frameset Result</H1>\n";
unless ($query->param) {
print "<b>No query submitted yet.</b>";
return;
}
print "Your name is <EM>",$query->param(name),"</EM>\n";
print "<P>The keywords are: <EM>",join(", ",$query->param(words)),"</EM>\n";
print "<P>Your favorite color is <EM>",$query->param(color),"</EM>\n";
}