0

我想使用 HTML 表单将变量传递给 Perl CGI 脚本,以便我可以处理该变量,然后在另一个 HTML 页面上打印出来。

这是我的 HTML 代码:http: //jsfiddle.net/wTVQ5/

这是我链接 HTML 的 Perl CGI 脚本。这是我想做的方式(因为它使用更少的行并且可能更有效)。

#!/usr/bin/perl
use warnings; use strict;
use CGI qw( :standard);
my $query = CGI->new;

# Process an HTTP request
my $user = $query->param('first_name');

# process $user... for example:
my $foo = "Foo";
my $str = $user . $foo;

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $str - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

这是我从教程中阅读的一种方式,对我来说更有意义:

#!/usr/bin/perl
use warnings; use strict;

my ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "POST") {
   read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
}else {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
@pairs = split(/&/, $buffer);
foreach $pair (@pairs) {
    ($name, $value) = split(/=/, $pair);
    $value =~ tr/+/ /;
    $value =~ s/%(..)/pack("C", hex($1))/eg;
    $FORM{$name} = $value;
}
my $user = $FORM{first_name};

# process $user... for example:
my $foo = "Foo";
my $str = $user . $foo;

print "Content-type:text/html\r\n\r\n";
print "<html>";
print "<head>";
print "<title>Hello - Second CGI Program</title>";
print "</head>";
print "<body>";
print "<h2>Hello $str - Second CGI Program</h2>";
print "</body>";
print "</html>";

1;

顺便说一句,这两个都不能正常工作。当我单击 HTML 页面上的提交按钮时,它只是将我链接到脚本,而不是传递变量、处理它并打印出 HTML 页面。

4

3 回答 3

1

这一行:

print "Content-type:text/html\r\n\r\n";

应该:

print "Content-type:text/html\n\n";

或更好:

print $query->header;

此外,请确保您的 Web 服务器已针对 CGI 进行了良好配置。而且,如果您有足够的时间,使用现代 Web 应用程序方法,有许多框架可能比 CGI 更好(Dancer、Mojolicious、OX、...)

于 2013-05-04T20:05:06.487 回答
1

你需要用这样的东西来编辑你的 httpd.conf。

AddHandler cgi-script cgi pl
<Directory /path/to/cgi/files>
Options +ExecCGI
</Directory>

如果您在本地运行它,您可以在您的主目录结构中创建一个名为public_html的文件夹并将其设置为运行您的脚本,您只需配置它也将其映射到该位置。

于 2013-05-04T22:09:28.393 回答
1

我看到你使用 CGI '标准',除非你只是想,否则不需要真正启动 CGI->new,而且你说的行更少,你可以做这样的事情。

use strict;
use warnings;
use CGI qw( :standard );

my $user = param('first_name') || q/foo/;

print header, 
      start_html(-title => 'Hello'), h1('Hello ' . $user), end_html;
于 2013-05-04T20:49:52.870 回答