带有Perl的简单表单应用程序



我在使用perl开发简单注册表单应用程序时有错误。

这是我的html。

<html>
<head>
    <meta charset="UTF-8">
    <title>Kayıt Formu</title>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
    <h2>Kayıt Formu</h2>
    <form id="signup-form" action="/sample_perl_application/signup.cgi" method="GET">
        <div class="form-group">
            <label for="name">Ad</label>
            <input class="form-control" id="name" name="name" type="text"/>
        </div>
        <div class="form-group">
            <label for="surname">Soyad</label>
            <input class="form-control" id="surname" name="surname" type="text"/>
        </div>
        <div class="form-group">
            <label for="age">Yaş</label>
            <input class="form-control" id="age" name="age" type="text"/>
        </div>
        <div class="form-group">
            <label for="sexual">Cinsiyet</label>
            <select class="form-control" id="sexual" name="sexual">
                <option id="male">Bay</option>
                <option id="female">Bayan</option>
            </select>
        </div>
        <input class="btn btn-default" id="save" name="save" type="submit" value="Kaydet"/>
    </form>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
</html>

这是我的perl脚本。

#!"c:xamppperlbinperl.exe"
use strict;
use warnings;
use CGI;
local ($buffer, @pairs, $pair, $name, $value, %FORM);
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $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;
}
$name = $FORM{name};
$surname = $FORM{surname};
$age = $FORM{age};
$gender = $FORM{sexual};
print CGI::header();
print $name." ".$surname." ".$age." ".$gender;

我有这样的错误。"标题前脚本输出的结尾:imigup.cgi"。如何解决问题?

您的第一个错误是尝试从教程Spoint网站学习Perl。他们真的不知道自己在说什么。尝试使用Perl教程中心,而不是指针以提高质量perl教程。

尽管CGI程序旨在在Web服务器上运行,但是从命令行中运行它们通常是很有用的。特别是,在跟踪语法错误时,您可以使用perl -c查看所有问题。我将您的代码放在名为" TestCGI"的文件中,然后运行命令perl -c testcgi。我得到以下输出:

$ perl -c testcgi 
Global symbol "$buffer" requires explicit package name (did you forget to declare "my $buffer"?) at testcgi line 8.
Global symbol "@pairs" requires explicit package name (did you forget to declare "my @pairs"?) at testcgi line 8.
Global symbol "$pair" requires explicit package name (did you forget to declare "my $pair"?) at testcgi line 8.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at testcgi line 8.
Global symbol "$value" requires explicit package name (did you forget to declare "my $value"?) at testcgi line 8.
Global symbol "%FORM" requires explicit package name (did you forget to declare "my %FORM"?) at testcgi line 8.
Global symbol "$buffer" requires explicit package name (did you forget to declare "my $buffer"?) at testcgi line 13.
Global symbol "@pairs" requires explicit package name (did you forget to declare "my @pairs"?) at testcgi line 17.
Global symbol "$buffer" requires explicit package name (did you forget to declare "my $buffer"?) at testcgi line 17.
Global symbol "$pair" requires explicit package name (did you forget to declare "my $pair"?) at testcgi line 19.
Global symbol "@pairs" requires explicit package name (did you forget to declare "my @pairs"?) at testcgi line 19.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at testcgi line 20.
Global symbol "$value" requires explicit package name (did you forget to declare "my $value"?) at testcgi line 20.
Global symbol "$pair" requires explicit package name (did you forget to declare "my $pair"?) at testcgi line 20.
Global symbol "$value" requires explicit package name (did you forget to declare "my $value"?) at testcgi line 21.
Global symbol "$value" requires explicit package name (did you forget to declare "my $value"?) at testcgi line 22.
Global symbol "%FORM" requires explicit package name (did you forget to declare "my %FORM"?) at testcgi line 23.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at testcgi line 23.
Global symbol "$value" requires explicit package name (did you forget to declare "my $value"?) at testcgi line 23.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at testcgi line 26.
Global symbol "%FORM" requires explicit package name (did you forget to declare "my %FORM"?) at testcgi line 26.
Global symbol "$surname" requires explicit package name (did you forget to declare "my $surname"?) at testcgi line 27.
Global symbol "%FORM" requires explicit package name (did you forget to declare "my %FORM"?) at testcgi line 27.
Global symbol "$age" requires explicit package name (did you forget to declare "my $age"?) at testcgi line 28.
Global symbol "%FORM" requires explicit package name (did you forget to declare "my %FORM"?) at testcgi line 28.
Global symbol "$gender" requires explicit package name (did you forget to declare "my $gender"?) at testcgi line 29.
Global symbol "%FORM" requires explicit package name (did you forget to declare "my %FORM"?) at testcgi line 29.
Global symbol "$name" requires explicit package name (did you forget to declare "my $name"?) at testcgi line 33.
Global symbol "$surname" requires explicit package name (did you forget to declare "my $surname"?) at testcgi line 33.
Global symbol "$age" requires explicit package name (did you forget to declare "my $age"?) at testcgi line 33.
Global symbol "$gender" requires explicit package name (did you forget to declare "my $gender"?) at testcgi line 33.
testcgi had compilation errors.

您可以看到所有错误都是相同的。您忘记了声明一些变量。您的代码应该看起来像:

#!"c:xamppperlbinperl.exe"
use strict;
use warnings;
use CGI;
# Read in text
$ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/;
my $buffer;
if ($ENV{'REQUEST_METHOD'} eq "GET") {
   $buffer = $ENV{'QUERY_STRING'};
}
# Split information into name/value pairs
my @pairs = split(/&/, $buffer);
my %FORM;
foreach my $pair (@pairs) {
   my ($name, $value) = split(/=/, $pair);
   $value =~ tr/+/ /;
   $value =~ s/%(..)/pack("C", hex($1))/eg;
   $FORM{$name} = $value;
}
my $name = $FORM{name};
my $surname = $FORM{surname};
my $age = $FORM{age};
my $gender = $FORM{sexual};
print CGI::header();
print $name." ".$surname." ".$age." ".$gender;

请注意,我使用my来声明变量,而不是locallocal在很大程度上是Perl 4的宿醉。由于二十年前发布了Perl 5,因此my是在Perl计划中声明大多数变量的最佳方法。还要注意,我将变量尽可能靠近使用。

我们可以在这里更改其他一些东西。

  • 如果我们从cgi.pm导入命名子例程,我们可以通过省略包装名称来对其进行调用。
  • 我们可以使用cgi.pm的param子例程来替换您的buggy CGI参数解析器。
  • 我们可以使用以下事实,即Perl变量以双引号的字符串扩展,以使您的print语句易于阅读。

进行这些更改,您的代码减少了:

#!"c:xamppperlbinperl.exe"
use strict;
use warnings;
use CGI qw(param header);
my $name    = param('name');
my $surname = param('surname');
my $age     = param('age');
my $gender  = param('sexual');
# We're outputing plain text, not HTML
print header(-content_type => 'text/plain');
print "$name $surname $age $gender";

看起来不太简单吗?

您可以从命令行进行测试:

$ perl testcgi2 'name=foo&surname=bar&age=18&sexual=M'
Content-Type: text/plain; charset=ISO-8859-1
foo bar 18 M

这里最大的教训是,如果您正在学习一种新语言,则不应该相信互联网上的随机教程网站。它们几乎没有用。询问知道该语言在哪里可以找到良好资源的人。

您尚未声明$年龄,$性别,$姓氏变量,因此脚本即将垂死。

尝试通过" perl -w myscript.pl"手动验证脚本,并在您的Web服务器错误日志中查看@ikegami建议的登录。

脚本中变量的声明与"现代perl"用法有些不同。

我通常会用"我的"声明内容,并使声明更接近使用情况,以便变量的范围受到约束:

my @pairs = split(/&/, $buffer);
foreach my $pair (@pairs) { 
    my($name, $value) = split(/=/, $pair);
my $surname = $FORM{surname};

etc

相关内容

最新更新