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