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

当方法为POST时,如何使用嵌入的HTML表单数据?,html,forms,perl,post,get,Html,Forms,Perl,Post,Get,我有一个学校作业。我们需要使用POST方法将数据从嵌入式HTML表单传递到Perl脚本。然后,Perl将遍历数据并将其显示回用户 我使用了一个单独的文件和GET方法,但我的导师说我必须嵌入HTML并使用POST。但是信息不再存储在环境变量中 是否有一个内置变量可用于访问此信息 #!/usr/bin/perl -w print "Content-Type:text/html\n\n"; $qstring = $ENV{'QUERY_STRING'}; $rmethod = $ENV{'REQU

我有一个学校作业。我们需要使用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)
#/usr/bin/perl-w
打印“内容类型:text/html\n\n”;
$qstring=$ENV{'QUERY_STRING'};
$rmethod=$ENV{'REQUEST_METHOD'};
如果($rmethod eq“GET”){
&displayform();
}
elsif($rmethod eq“POST”){
@pairs=拆分(/&/,$qstring);
foreach(@pairs){
($key,$value)=拆分(/=/);
$value=~tr/+/;
$value=~s/%([a-fA-F0-9][a-fA-F0-9])/pack(“C”,十六进制($1))/eg;
$form{$key}=$value;
}
打印“学生调查”\n;
打印“\n”;
&displayInfo();
打印“\n”;
}
打印“\n”;
}
子显示信息{
打印“全名:”,$form{“person”},
”; 打印“收藏夹:”,$form{“sport”},“
”; 打印“最喜爱的课程:”,$form{“Course”},
”; 打印“GPA:”,$form{“GPA”},“
”; } 子显示窗体{ 打印qq(表格在这里)
有人在教你非常糟糕的做法。我不知道你的示例代码是否遵循了学校提供的示例,或者你是否是从互联网上的糟糕示例拼凑而成的-但无论如何,此代码使用的技术已经过时了二十年

2017年关于教授CGI编程的智慧有一场完整的辩论(关于一些更好的方法的简要讨论,请参见),但我们忽略这一点,假设CGI是一个好主意

如果您正在编写一个CGI程序,那么您应该使用这个库,它是标准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是一个糟糕的想法

其他几点:

  • 始终
    使用严格的
    使用警告
  • shebang上的
    -w
    于2000年被
    使用警告
    淘汰
  • 自从1994年Perl5发布以来,在子例程调用上使用
    &
    是没有必要的
我知道你知道得再清楚不过了,你只是按照老师告诉你的去做。但看到学校里教这种过时的做法,真是令人沮丧


更新:只需将答案添加到原始问题中。没错,在POST请求中,
QUERY\u STRING
环境变量中不再提供参数数据-您需要从
STDIN
读取它。这是CGI.pm的许多优点之一-您使用相同的方法(
param()
子例程)访问GET和POST参数。

考虑到这是学校作业,您需要付出大量的努力。请更新您的问题,以显示新方法,显示您在a中面临的具体问题。我认为我的问题存在于测试后的环境变量中ing我一直无法找到一种方法来提取表单元素。到目前为止,我的脚本都是经过编辑显示的。使用20世纪最后十年的货运文化代码来代替。此外,如果这是他们教给你的,请要求退款。我假设你应该
使用严格的
使用警告
,并缩进你的代码正确吗?我已经整理了你展示的Perl,这样我就可以阅读它了,很明显它甚至不会编译。我们不是来整理你的垃圾代码的。如果你写的东西不好,我当然不会帮你修改。@Borodin:我只是看看。谢谢,我已经完成了作业是的,这门课程是基于一位教授,他在15年前写的,从未改变过任何东西。