2017-05-01 11 views
-4

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:\xampp\perl\bin\perl.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; 

このようなエラーがあります。 msgstr "ヘッダの前にスクリプト出力の終わり:signup.cgi"。 問題を解決するにはどうすればよいですか?

+2

まず、どのようなエラーが発生しているかを調べる必要があります。 Webサーバーは通常、CGIスクリプトのstderr出力をエラーログに送信します。 – ikegami

+2

しかし、あなたは、あなたが変数を宣言していないことから、 'use strict;'を使って、あなたがそうするように強制したいと言っているにもかかわらず、プログラムを見ることはできません。 – ikegami

+3

CGI.pmを使用している場合、なぜCGI要求を解析していますか? 'param'を使ってください! – ikegami

答えて

2

あなたは$ age、$ gender、$ surname変数を宣言していないので、スクリプトは死んでいます。

'perl -w myscript.pl'でスクリプトを手動で確認し、ウェブサーバーのエラーログで@ikegamiを確認してみてください。

スクリプト内の変数の宣言は、 '現代のPerl'の使用法とは少し異なります。

私は通常「私」で物事を宣言し、変数のスコープが拘束されているので、使用する宣言が近くになるだろう:

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

my $surname = $FORM{surname}; 

その他、各種

+4

を参照してください。そのサイトはPerl CGIスクリプティングすべての変数($ gender、$ surname)を宣言していないので、あなたのスクリプトが死ぬように、 'use strict'を推奨値として追加しました。 'my'が 'local'より優先される理由については、この回答(https://stackoverflow.com/a/3603720/3575160)をご覧ください。 –

6

最初の間違いは、PerlをTutorialsPointサイトから学ぶことです。彼らは本当に彼らが何を話しているのか分かりません。代わりにPerl tutorials hubを試して、より質の高い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. 

すべてのエラーが同じであることがわかります。変数のいくつかを宣言することを忘れてしまった。私は、変数ではなく、localを宣言するためにmyを使用している

#!"c:\xampp\perl\bin\perl.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; 

お知らせ:あなたのコードは次のようになります。 localは主にPerl 4の二日酔いです。Perl 5は20年以上前にリリースされて以来、myはPerlプログラムのほとんどの変数を宣言する最良の方法でした。また、変数を使用する場所のできるだけ近くに変数を宣言することに注意してください。

ここで変更できるものがいくつかあります。

  • CGI.pmから名前付きサブルーチンをインポートすると、パッケージ名を省略することで、より洗練された呼び出しを行うことができます。
  • CGI.pmのparamサブルーチンを使用して、バギーCGIパラメータパーサーを置き換えることができます。
  • printステートメントを読みやすくするために、Perl変数を二重引用符で囲んだ文字列で展開することができます。これらの変更を加える

、あなたのコードは、これに削減:

#!"c:\xampp\perl\bin\perl.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 

ここでの最大の教訓は、あなたが新しい言語を学習している場合は、あなたがインターネット上でランダムなチュートリアルサイトを信用してはならないということです。彼らはめったに使用されていません。言語を知っている人に、良いリソースを見つける場所を尋ねます。

関連する問題