Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.
For the best experience please use the latest Chrome, Safari or Firefox browser.


$ git clone git://github.com/perl-entrance-org/perl-entrance-2012-09.gitでclone(ダウンロード)しましょう.$ sudo apt-get install git-coreでOKです.hello.plを使います.cd perl-entrance-2012-09でcloneしたディレクトリに移動し, $ morbo hello.plを実行します. ブラウザでlocalhosot:3000にアクセスすれば, 挙動を確認することができます.__DATA__以下の部分)と, ウェブアプリケーションの挙動を決める部分を1つのファイルで記述できる, ということを学びました.hello.plは, アクセスすると常にあなたの名前を表示します.
@@ index.html.ep<html><head><title>hello!</title></head><body style='padding: 30px;'><form action="/hello" method="post"><input type="text" name="name" size="20" /><input type="submit" name="submit" value="送信" /></form></body></html>
__DATA__以下の部分)を, このように書き換えます.
<form action="/hello" method="post">...</form>
<form>から</form>で囲まれた範囲が1つのフォームとなります.<form>には, どのページにデータを送信するかをactionで, どんな方法でデータを送信するかをmethodで指定しなければなりません.
postとgetが存在します. 詳細は後述します.
<input type="text" name="name" size="20" />
<input>で, データを入力する部品を用意することができます.typeは部品の形状を指定します. 例えばtextは, このようなテキストを入力できる部品を用意してくれます.
text以外にも, ラジオボタンradio, チェックボックスcheckboxなどがあります.
<input type="submit" name="submit" value="送信" />
submitは送信ボタン( )です. ボタンには, valueで指定した文字が表示されます.<input>内部のnameで指定された文字列と紐付られ, actionで指定されたページへ転送されます.
use Mojolicious::Lite;use utf8;get '/' => 'index';app->start;
__DATA__より上の部分)は特に処理を行う必要がないので, このように変更します.
get '/'と => 'index'の間に=> sub { ... }でコードを書いていましたが, 今回のように, 処理がない場合は省略可能です.Page not found... yet!のようなエラー出てくるはずです.
@@ hello.html.ep<html><head><title>hello, <%= $name %>!</title></head><body style='padding: 30px;'>こんにちは<%= $name %>さん</body></html>
$nameを送り, 表示します.
post '/hello' => sub {my $self = shift;my $name = $self->param('name');$self->stash( name => $name );$self->render();} => 'hello';
app->start;よりも上に, このようなコードを書きます.
post '/hello' => sub {...}
/helloというページに, postメソッドでアクセスした際の処理を書きます.<form>でmethod="post"と設定したので, 先頭をpostにしています. method="get"と設定した場合はgetにします.
my $name = $self->param('name') || '名無し';
paramを使うことで, フォームから送信されたデータを受け取ることができます.<input type="text" name="name" size="20">で宣言していた為, テキストボックスに入力された名前はnameで参照することができます.$self->param('name') || '名無し'としているのは, 入力が空だった場合にわかりやすくする為です(「こんにちはnoneさん」と表示される).question01.plを使います./bmiに名前とBMIが表示されるように, コードを書いてみましょう.
身長(kg) / 身長(m) * 身長(m)で計算できます.
<table><tr><td>名前</td><td>papix</td></tr><tr><td>身長</td><td>180cm</td></tr>:</table>
<table><tr><td>名前</td><td><%= $name %></td></tr><tr><td>身長</td><td><%= $height %></td></tr>:</table>
list.plを書き換えて行きましょう.
post '/data' => sub {my $self = shift;$self->stash( data => {'名前' => $self->param('name'),'身長' => $self->param('height'),'体重' => $self->param('weight'),'年齢' => $self->param('age'),'趣味' => $self->param('hobby'),} );$self->render();} => 'data';
@@ data.html.ep<html><head><title>Output</title></head><body style='padding: 30px;'><table>% for my $topic (qw/名前 身長 体重 年齢 趣味/) {<tr><td><%= $topic ></td><td><%= $data->{$topic} %></td></tr>% }</table></body></html>
%がある行はPerlのコードが書かれている, と解釈します.question02.plの, __DATA__以下の部分のみを書き換えて(テンプレートのみを書き換えて)次のような出力を行うページを作ろう.
/doというページに, フォームに入力したデータを送信する./doページでは, 次のような処理を行う.
hello, (入力した文字列)さん!と表示する.+, -, /, *, %で区切られた2つの数値(例えば123+45)なら, その演算を行い, 結果を出力する(例の場合, 123 + 45 = 168と表示する).undefinedと表示する.
<html><head><title>... title ...</title></head><body style='padding: 30px;'>... contents ...</body></html>
list.plを, レイアウトを使って更に改造します.
@@ layouts/common.html.ep<html><head><title><%= $title %></title></head><body style='padding: 30px;'><%= content %></body></html>
__DATA__以下の部分にレイアウトを記載します.<%= content %>には, それぞれのページで表示する内容が埋め込まれます.<%= $title %>とすることで, その部分だけ変更することができます.
@@ index.html.ep% layout 'common', title => 'Input'<form action="/data" method="post">名前: <input type="text" name="name" size="20"><br>身長: <input type="text" name="height" size="4">cm<br>体重: <input type="text" name="weight" size="4">kg<br>年齢: <input type="text" name="age" size="4"><br>趣味: <input type="text" name="hobby" size="20"><br><input type="submit" name="submit" value="送信"><br></form>
% layout 'common'で使用するテンプレートの名前を指定します. 更に,title => 'Input'でページのタイトルを変更することができます(テンプレートの<%= $title %>に埋め込まれる).list.plの, data.html.epのテンプレートを, レイアウトを使うように書き換えてみよう.post.plを使います.post.plは, postメソッドを使って書かれています./dataに転送されます.post.plを, getメソッドを使うように書き換えます.post.plを, get.plという名前でコピー($ cp post.pl get.pl)します.
<form action="/data" method="get">名前: <input type="text" name="name" size="20"><br><input type="submit" name="submit" value="send"><br></form>
postからgetに書き換えます.
get '/data' => sub {my $self = shift;my $name = $self->param('name');$self->stash( name => $name );$self->render();} => 'data';
postからgetに書き換えることで, /dataに対してgetメソッドでアクセスした場合の処理を書くことができます.$self->param()で送られたデータを受け取ることができます.URL?name=value&name=value ...となる.get.plを起動し, localhost:3000/data?name=papixにアクセスすると...
post.plでも同様の行為を行うとどうなるでしょうか...?/にアクセスすると, 1つのテキストボックスと送信ボタンが表示される./outputにデータを送る./outputでは次のような処理を行う.
perl-entranceが送られたなら, hello, perl-entrance!などのように表示する.-2が送られたなら, -2の3乗は-8などのように表示する.-12.3456が送られたなら, -12.3456の整数部は-12などのように表示する.undefinedと表示する.errorと表示する.rev_polish関数を作ろう.
rev_polish関数は, 逆ポーランド記法の計算を行う関数である.&rev_polish('3 4 +')など), その計算結果を返す.3 1.2 +などは不可).1 2 3 +や3 1.2 +など)は, undefを返す.P:が付く場合, それ以降のテキストを逆ポーランド記法の式として, rev_polish関数で演算するように書き換えよう.1 2 +なら, 1 2 + の演算結果は 3 ですなどと表示する.演算できませんでしたという文字を表示する.Use a spacebar or arrow keys to navigate