CGI.pm を使わずにフォームデータを受け取って表示する

2011年10月2日日曜日

perl

t f B! P L

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/&/&amp;/g;
 $data =~ s/</&lt;/g;
 $data =~ s/>/&gt;/g;
 $data =~ s/"/&quot;/g;
 $data =~ s/'/&#39;/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;
}

QooQ