こんにちは、3年くらいPerlを書いていないtakuji31です。
これはPerl5 Advent Calendar 2015 14日目の記事です。
13日目はpine613さんの「CentOS 標準搭載の Perl に負けないで強く生きる」でした。
今日は近々Perlを書く機会ができるかもしれないので、リハビリとして環境構築からNoPasteを作るところまでをやってみました。
環境構築
plenvでPerl5.22.0とcpanmを入れます。
今回はCartonとMojoliciousを使うのでcpanmでインストールしましょう。
plenvは更新止まってるみたいですけど、最近は別のツールが使われてるのかな…?Google力不足で発見できませんでした。
curl -L http://is.gd/plenvsetup | bash . $HOME/.zprofile plenv install 5.22.0 plenv global 5.22.0 plenv install-cpanm cpanm Carton Mojolicious
プロジェクトを作る
mojoコマンドを叩くとペライチのスクリプトファイルが1枚できあがります。
mojo generate lite_app
バージョン固定のためにCartonを使いましょう、以下のようにcpanfileを書きます。
requires 'Mojolicious', '6.36'
とりあえず動かしてみましょう。
carton install carton exec morbo myapp.pl
http://localhost:3000/を開いてページが出てきたら成功です。
データーを保存する
雑な感じですがデーターを保存してみましょう。
保存にはRedisを使います、brew辺りで適当にインストールしておきましょう。
cpanfileにはRedis::FastとData::UUIDを追加します。
requires 'Mojolicious', '6.36'; requires 'Redis::Fast', '0.16'; requires 'Data::UUID', '1.221'
DATAセクションのテンプレートを書き換えてformを作って
@@ index.html.ep % layout 'default'; % title 'NoPaste'; <h1>No Paste</h1> %= form_for '/' => (method => 'POST') => begin %= text_area 'body', cols => '100', rows => '20' %= submit_button 'Paste' % end
保存のコードを書きます。入力されているかくらいはチェックしておきましょう。
post '/' => sub ($c) { my $body = $c->param('body'); my $redis = Redis::Fast->new; if ($body) { my $uuid = Data::UUID->new->create_str; $redis->set($uuid, $body); $c->redirect_to('showuuid', {uuid => $uuid}); } else { $c->redirect_to('/'); } };
これでとりあえず、「POSTしたらRedisにsetしてリダイレクトする」だけのページが完成しました。
あとはリダイレクト先で表示してやりましょう。
@@ show.html.ep % layout 'default'; % title 'NoPaste'; <h1>No Paste</h1> <pre> %= $body </pre>
get '/show/:uuid' => sub ($c) { my $redis = Redis::Fast->new; my $body = $redis->get($c->param('uuid')); if ($body) { $c->stash('body' => $body); $c->render(template => 'show'); } else { $c->redirect_to('/'); } };
渡されたキーを元にRedisからデーターを引っ張ってきて、表示してやります。
これで簡単なNoPasteが完成しました。
サンプルコード
サンプルコードはGithubに置いてあります。
まとめ
3年も書いてないから忘れてるかなぁと思いましたが、割と忘れてませんでした。
最近Perl書いてないよ、という方もこれを機に書いてみてはいかがでしょうか。
明日はxtetsujiさんの「標準添付の Math:: 系モジュールの解説」です、お楽しみに。