LoginSignup
5

More than 5 years have passed since last update.

[Perl] [連載]PSGI入門第一章 環境変数の一覧を出す

Last updated at Posted at 2017-02-10

PSGI入門でググっても本当の導入だけで実用的な実装が なかなか見当たらなくて辛かったので、本記事でそのあたりをフォローしようと思います。

本記事の対象

  1. CGIの読み書きができる
  2. けど、Mojolicious使うにはためらいがある(私のような1
  3. perl使い

必要な環境(というか本記事では記載しない準備運動)

  1. perlまたはperlbrewなどのインストール2
  2. cpanmのインストール3
  3. Plack及びその他本文に出てくるモジュールのインストール

PSGIを直接書くメリット

  • 本番環境を用意するまではサーバー設定が不要4
  • RoRだとかMVCだとかを理解してなくても自分のperlの知識だけで書ける
  • HTTPレスポンスの構造を理解してなくてもかけてしまう5
  • バイバイ(x)html4 & use CGI! ハロー!HTML5 & use Text::Xslate!
  • バイバイuse CGI::Carp!エラーは自動で表示してくれる!

PSGIを直接書くデメリット

  • ドキュメント少ねぇ!お前ら”Hallo World!”だけで終わらせすぎ!
  • デフォルトのセッション機能が弱い(個人の主観です)6

本日のお題:環境変数の一覧を出す。

ここまで執筆してスタミナ切れたので連載にします。今日のお題は環境変数の取得とその一覧の出力です。

Myapp.pl
use strict;
use warnings;
use Carp;

use Plack::App::Path::Router::PSGI;
use Path::Router;
use Plack::Request;

my $router = Path::Router->new;
$router->add_route( '/' => target => \&env );

# now create the Plack app
my $app = Plack::App::Path::Router::PSGI->new( router => $router );
$app->to_app();

# 以下routerで呼ばれる要素
sub env {
    my $env = shift;
    my @str;
    while ( my ( $key, $value ) = each %$env ) {
        push @str, "$key = $value" unless ref $value;
    }
    return response( $env,
        join( "<br>\n", '<html><body><h1>環境変数一覧</h1>', sort(@str), '</body></html>')
    );
}

# 以下サブルーチン
sub response {
    my $env = shift;
    my $body = shift || croak 'empty body!';
    my %ARG = @_ if @_;
    my $status = $ARG{'-status'} || 200;
    croak "unvalid status: $status" if $status !~ /^\d{3}$/s;
    my $mime = $ARG{'-MIME'} || 'text/html; charset=utf-8';
    my $headers = $ARG{'-headers'} || {};
    my $req = Plack::Request->new($env);
    my $res = $req->new_response($status);
    $res->content_type($mime);
    $res->header( $headers );
    $res->body($body);
    $res->finalize;
}

__END__

として、$ plackup Myapp.pl -rでおk7
どうだ!簡単だろ!? use Jcode;use utf8;use Encode;も要らんですたい!

次章

PSGI入門第二章 CGI::SessionをPSGIで無理やり使う

宣伝

本記事は自前で有料WebサービスをPerlで書いてリリースするに辺り、つまづいた点や気づいたことを共有する目的で書き始めました。

worthmine-qiita.pngこちらのQRコードをスマホで読み取り、
興味を持った方はhttps://qrown.meまでぜひお立ち寄りください!



  1. web APIを実装するわけでもなく、ただ単にWebアプリケーションを構築したいだけだったり、RoRを触ったことなかったりしたらMojoliciousって敷居高くないですか? 

  2. http://qiita.com/chansuke/items/43543590dc6d14639a83 

  3. http://qiita.com/hagino3000/items/1cce5c607828637c6976 

  4. 本番環境ではポート80を使うためにApache/nginxを止めてsudoを使うか素直にApache/nginxをリバースプロクシとして使う必要があるがplackup Myapp.plなどとする場合にはデフォルトでポート5000を使うのでhttp://localhost:5000などとブラウザに打てば良い。 

  5. use Plack::Request;またはuse Plack::Response;しろ 

  6. CGI::Sessionに依存してると$session->expire(‘+1y’)とか描きたくなるが、自前で実装しなくてはいけない 

  7. -r オプションはスクリプト本体と./lib以下の変更を検知して自動的に再起動するオプション 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5