Perl

軽量なCGIモジュール CGI::Minimal

PerlのモジュールCGI::Minimalは、よく使う機能、主にリクエストの処理程度に絞った軽量なモジュールです。標準のCGIモジュールはほとんどフレームワークみたいな存在なので、使い方によってはその大きさからコストが生じる場合があります。かといって車輪の再開発をする必要もなく、リクエストを取得する程度の小さなスクリプトではCGI::Minimalが役に立ちます。

Jerilyn Franz _ CGI-Minimal-1.29 - search.cpan.org

#!/usr/bin/perl

use strict;
use utf8;
use CGI::Minimal;

my $q = CGI::Minimal->new;

my @params = $q->param;

print "content-type: text/plain; charset=utf8\n\n";
print join "\n", @params;

exit();

CGI::Minimalは、メンテナンスも止まっているようですがmod_perl環境にも対応していて軽快に動作するようシンプルな設計になっています。ドキュメントにはCGIモジュールをはじめその他の派生モジュールと比較したベンチも掲載されています。

レンタルサーバにインストールされていなくてもスクリプトと一緒にアップロードすれば使えます。モジュールを読み込むスクリプトと別のディレクトリに置いてuseする時には@INCにディレクトリを追加しておくといいです。

#!/usr/bin/perl

BEGIN {
  # 同じ階層にある lib ディレクトリ にモジュールを置く場合
  unshift @INC, qw(./lib);
}
use CGI::Minimal;

メソッドはPODにある通りです。インスタンスを作成しなくても使える点とparamメソッドはCGIモジュールとほぼ同じように使えると思います。utf8の環境ではパラメータの値を内部文字列に変更する必要があるかもしれません。必要最低限のメソッドしかなく覚えるのは楽です。

#!/usr/bin/perl

use strict;
use utf8;
use Encode;

use CGI::Minimal;

# 最大容量の指定
CGI::Minimal::max_read_size(1000000);

# POSTとGETの両方を取得
CGI::Minimal::allow_hybrid_post_get(1);

# インスタンスを作成
my $q = CGI::Minimal->new;

# パラメータ
my @params = $q->param;

# パラメータを内部文字列に変換(Encode.pmを使用)
my $utf8 = find_encoding('utf8'); # UTF8オブジェクト
my $string = $q->param('textfield');
my $result = $string ? $utf8->decode( $string ) : '';

# MIMEタイプ
$result .= 'ファイルのMIMEタイプ: ' . $q->param_mime('file');

# ファイル名
$result .= 'ファイル名: ' . $q->param_filename('file');

# 時刻のフォーマット文字列を作成
my $datetime = $q->date_rfc1123(time + 3600);

# URLエンコード
my $encode_url = 'http://example.com/?test=' . $q->url_encode('?');

# URLデコード
my $decode_url = 'http://example.com/?test=' . $q->url_decode('%3f');

# HTMLエスケープ
my $htmlize = $q->htmlize('<p>テスト文字列</p>');

# HTMLの復元
my $dehtmlize = $q->dehtmlize('&lt;p&gt;テスト文字列&lt;/p&gt;');

# 容量オーバーのフラグ
my $error = $q->truncated ? '<p style="color: red">容量オーバーです。</p>' : '';

# パラメータを削除
$q->delete('file');

# パラメータを全て削除
$q->delete_all;

print <<"EOT";
content-type: text/html; charset=utf8

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>テストページ</title>
</head>
<body>
<form action="?" method="POST" accept-charset="utf-8" enctype="multipart/form-data">
${error}
<p>
<input type="file" name="file" value="">
<input type="text" name="textfield" value="あいうえお">
<input type="submit" value="送信">
</p>
</form>
EOT

# テーブルを表示
print "<h1>calling_parms_table</h1>";
print $q->calling_parms_table;

#
print "</body></html>";

exit();