我有一份上学的任务。我们需要使用POST方法将数据从嵌入的HTML表单传递到Perl脚本。然后,Perl将遍历数据并将其显示回用户。
我使用的是单独的文件和GET方法,但我的导师说我必须嵌入HTML并使用POST。但是信息不再存储在环境变量中。
是否有可用于访问此信息的内置变量?
#!/usr/bin/perl -w
print "Content-Type:text/html\n\n";
$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)
答案 0 :(得分:3)
有人教你非常糟糕的做法。我不知道您的示例代码是否遵循您学校提供的示例,或者您是否从互联网上的不良示例中将它拼凑在一起 - 但不管怎样,此代码使用的技术已经过时了20年。
关于2017年CGI编程教学的智慧,有一个充分的争论(参见CGI::Alternatives对一些更好的方法的简要讨论)但是让我们忽略它并假设CGI在这里是一个好主意。 / p>
如果您正在编写CGI程序,那么您应该使用已成为标准Perl发行版一部分的CGI.pm库超过二十年(最近已将其删除,但您的学校使用的可能性很高)这个最新的版本很小。)
使用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是一个糟糕的主意。使用模板系统更好(我推荐Template Toolkit)。
其他几点:
use strict
和use warnings
。-w
于2000年被use warnings
淘汰。&
是不必要的。我知道你不知道更好,你只是按照老师的要求去做。但是,在学校里教授这种过时的做法真是令人沮丧。
更新:只是为原始问题添加答案。您是正确的,在POST请求中,QUERY_STRING
环境变量中的参数数据不再可用 - 您需要从STDIN
读取它。这是CGI.pm的众多优点之一 - 您使用相同的方法(param()
子例程)来访问GET和POST参数。