0

当我开始我的 cgi 程序时,我想输出一个 html 表单。我知道我可以通过执行以下示例 perl 脚本来做到这一点。

sub MakePage()
{
print "Content-type: text/html\n\n";
print "<html><head><title>Hello World Form</title></head><body>\n";

print "<center><big><big><big><strong>\n";
print "Hello World Form<p>\n";
print "</strong></big></big></big>\n";

print "<FORM ACTION=\"./stdin.cgi\" METHOD=\"POST\">\n";
print "The Field...<br>\n";
print "<input type=\"text\" name=\"TXhelloField\" size=\"100\" \n";
print "value=\"" . MakeString() . "\">\n";
print "<INPUT type=\"submit\" name=\"BXsub\" value=\"Submit\">\n";
print "</form>"; 

print "</body></html>\n"; 
}

MakePage();

但是,我想将 html 表单放在一个名为 form1.html 的自己的文件中,然后使用以下内容调用它:

sub MakePage()
{
Location: form1.html;
}

我是 cgi 和 perl 的新手,在解决这个问题时遇到了麻烦,并且在教程中找到这个的运气并不好。谢谢。

4

3 回答 3

3

您需要输出标题,以及合适的状态代码和解释。

print "Status: 302 Found\r\n"
print "Location: http://example.com/form1.html\r\n";
print "Content-type: text/html;charset=utf-8\r\n\r\n"; 

print "<!DOCTYPE HTML><html lang="en"><head><title>Moved</title></head><body><p>This document can be found at <a href="http://example.com/form1.html">http://example.com/form1.html</a>.</p>\r\n";

(注意:位置标头需要绝对 URI,即使大多数浏览器会玩错误恢复游戏)。

于 2013-04-01T21:02:14.873 回答
3

看看 HTML::Template 或 Template::Toolkit。它们将帮助您将 HTML 与 perl 代码分开。例如

use HTML::Template;
use CGI;
my $template = HTML::Template->new(filename => 'form1.tmpl');
# replace MAKESTRING TMPL_VAR with string returned by your function
$template->param(MAKESTRING => MakeString()); 
my $cgi = CGI->new();
print $cgi->header();
print $template->output();
于 2013-04-01T21:23:40.053 回答
1

如果您只是想进行重定向,我建议您使用 CGI.pm 的redirect方法 ( print $q->redirect('http://myserver.com/form1.html')) 而不是手动打印 HTTP 标头。

如果您需要将任何 Perl 数据放入返回的页面,向页面添加页眉/页脚/侧边栏等,那么使用适当的模板解决方案,如 imran 建议的那样,绝对是要走的路。(哪一个? 多年来,Template::Toolkit一直是最流行和广泛使用的模板引擎,但以速度慢着称。其他不错的选择是Template::Alloy,它主要是替代品对于 TT 更快,或者Text::Xslate,这是我个人在有选择时使用的。)

于 2013-04-02T06:05:51.030 回答