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