当方法是 POST 时,如何使用嵌入式 HTML 表单数据?



我有一个学校作业。我们需要使用 POST 方法将数据从嵌入式 HTML 表单传递到 Perl 脚本。然后Perl将循环访问数据并将其显示给用户。

我使用了一个单独的文件和GET方法,但我的老师说我必须嵌入HTML并使用POST。但信息不再存储在环境变量中。

是否有可用于访问此信息的内置变量?

#!/usr/bin/perl -w
print "Content-Type:text/htmlnn";
$qstring = $ENV{'QUERY_STRING'};
$rmethod = $ENV{'REQUEST_METHOD'};
if ( $rmethod eq "GET" ) {
&displayform();
}
elsif ( $rmethod eq "POST" ) {
@pairs = split(/&/, $qstring);
foreach (@pairs) {
($key, $value) = split(/=/);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$form{$key} = $value;
}
print "<html><head><title>Student Survey</title></head>n";
print "<body>n";
&displayInfo();
print "</body></html>n";
}
print "</body></html>n";
}
sub displayInfo {
print "Full Name:",        $form{"person"}, "<br>";
print "Favourite:",        $form{"sport"},  "<br>";
print "Favourite Course:", $form{"course"}, "<br>";
print "GPA:",              $form{"gpa"},    "<br>";
}
sub displayform {
print qq~ (FORM GOES HERE)

有人在教你非常糟糕的做法。我不知道您的示例代码是否遵循您学校提供的示例,或者您是否从互联网上的不良示例中将其拼凑在一起 - 但无论哪种方式,此代码都使用了已经过时二十年的技术。

关于2017年教授CGI编程的智慧,有一整场争论(参见CGI::Alternatives,简要讨论一些更好的方法),但让我们忽略这一点,并假设CGI在这里是一个好主意。

如果你正在编写一个CGI程序,那么你应该使用 CGI.pm 库,它已经成为标准Perl发行版的一部分超过二十年(它最近被删除了,但你的学校使用这个最新版本的机会很小)。

使用 CGI.pm 的标准CGI程序如下所示:

#!/user/bin/env perl
use strict;
use warnings;
use CGI qw[header param]; # Load the two functions we're going to use
# Display the content-type header
print header;
# See if we have been passed parameters.
if (param) {
# Display the parameters
# Note: I've ignored HTML here. You shouldn't
print 'Name: ', param('person');
print 'Sport: ', param('sport');
# etc... 
} else {
# Display the form
...
}

在我的示例中,我忽略了 HTML,因为在 Perl 代码中嵌入 HTML 是一个糟糕的主意。使用模板系统是一个更好的主意(我推荐模板工具包)。

其他几点:

  • 总是use strictuse warnings.
  • 舍邦河上的-w在2000年被use warnings淘汰。
  • 自 Perl 5 于 1994 年发布以来,在子例程调用中使用&是不必要的。

我知道你不知道更好,你只是在按照老师告诉你做的事情去做。但是,看到学校里教授这种过时的做法,真的很令人沮丧。

更新:只是为了将答案添加到您的原始问题中。您是对的,在 POST 请求中,参数数据在QUERY_STRING环境变量中不再可用 - 您需要从STDIN读取它。这是 CGI.pm 的众多优点之一 - 您可以使用相同的方法(param()子例程)来访问GET和POST参数。

最新更新