CGI.pm を使わずにフォームデータを受け取って表示するソースメモ。
チェックボックスやマルチセレクトのように複数の値が送られてくるものには対応しておらず、ファイルアップロードにも対応してません。
CGI のデータの入出力には CGI.pm を利用することを強く推奨します。これはあくまで習作です。
#!/usr/bin/perl
use strict;
print <<End_of_Header;
Content-Type: text/html; charset=euc-jp
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=euc-jp">
<title>CGI</title>
</head>
<body>
End_of_Header
my $query;
if ($ENV{'REQUEST_METHOD'} eq 'GET') {
# GET
$query = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq 'POST') {
# POST
if ($ENV{'CONTENT_LENGTH'} > 10240) { er("なげーよ。"); }
read(STDIN,$query,$ENV{'CONTENT_LENGTH'});
} else {
er("対応していないメソッドです。");
}
# split
my %data;
foreach (split /&/,$query) {
my ($k,$v) = split /=/;
$data{decode($k)} = decode($v);
}
# print
print "<table border=\"1\">\n";
print "<tr><th>KEY</th><td>VALUE</td></tr>\n";
foreach (keys %data) {
print "<tr><th>" . escape($_) . "</th><td>" . escape($data{$_}) . "</td></tr>\n";
}
print "</table>\n";
footer();
# SUB
sub decode {
my $data = shift;
$data =~ tr/+/ /;
$data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg;
$data =~ s/\x0D\x0A/\n/g;
$data =~ tr/\x0D\x0A/\n\n/;
return $data;
}
sub escape {
my $data = shift;
$data =~ s/&/&/g;
$data =~ s/</</g;
$data =~ s/>/>/g;
$data =~ s/"/"/g;
$data =~ s/'/'/g;
$data =~ s/\n/<br>/g;
return $data;
}
sub er {
my $msg = shift;
print "<strong>$msg</strong>\n";
footer();
}
sub footer {
print "</body>\n</html>\n";
exit;
}

0 件のコメント:
コメントを投稿