sironekotoroの日記

Perl で楽をしたい

Perl入学式 #6

Perl入学式 #6

  • YAPC::Asia2013で初参加してからはや半年。
  • とうとう、WAFつかって一行掲示板を作るところまで引き上げてもらった。

Mojolicious::Lite

いざ復習

準備

  • コンソールからmojo generate lite_app アプリ名 でひな形作成
    • 今回は mojo generate lite_app hello
  • morbo hello でwebサーバが実行される
    • ブラウザでhttp://localhost:3000へアクセスすると、「Welcome to the Mojolicious real-time web framework! 」と表示されたページが。
  • ここまで簡単だけど、これ、いざ、Apacheいれて、ディレクティブとかconfファイルいじって云々とか考えたら凄い楽だよなぁ。
  • すぐに試せて結果が出るって素敵

コードをいじる

  • get '/' sub ={} の部分ってのはMVCで言うところのControllerに当たるのだろう・・・なぁ?(自信ない)
  • self->stash()にいれたハッシュで値をViewに渡す。
  • ハッシュなのでvalueとして配列やハッシュを渡す場合にはリファレンスでいれてあげる必要がある
  • epはembedded perlの略
  • ひな形のep部にある
    <head><title><%= title %></title></head>

    <head><title><%= $title %></title></head>
    の方が個人的にわかりやすいなぁとか。

Mojoliciousでfizzbuzzを表示

  • 昨日はテンプレートのところにfizzbuzzのfor文をかいたけど、これはよろしくないとのこと。

    • デザイナーさんと分業するときなんかに、彼らの領域にあまり入り込まないため、というような
    • 表示を司るViewにプログラムが入り混むのは良くない、と。なるほど納得。
  • fizzbuzzをController部に書いてみる

    • fizzbuzzの結果を配列に格納
    • 格納した配列のリファレンスをstashに入れる
    • Viewに当たるテンプレートのところで配列から取り出して表示させる
my @fizzbuzz;
get '/fizzbuzz' => sub {
    my $self = shift;
    for my $i ( 1 .. 100 ) {
        if ( $i % 15 == 0 ) {
            push @fizzbuzz, 'fizzbuzz' ;
        }
        elsif ( $i % 3 == 0 ) {
            push @fizzbuzz, 'fizz';
        }
        elsif ( $i % 5 == 0 ) {
            push @fizzbuzz, 'buzz';
        }
        else {
            push @fizzbuzz, $i;
        }
    }
    $self->stash( title => 'fizzbuzz', number => \@fizzbuzz );
    $self->render('fizzbuzz');
};


@@ fizzbuzz.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= $title %></title></head>
  <body>
  <h1><%= $title %></h1>
  % for my $i (@$number){
  <%= $i %><br>
  % }
  </body>
</html>
my $fizzbuzz2;
get '/fizzbuzz2' => sub {
    my $self = shift;
    for my $i ( 1 .. 100 ) {
        if ( $i % 15 == 0 ) {
            push @$fizzbuzz2, 'fizzbuzz';
        }
        elsif ( $i % 3 == 0 ) {
            push @$fizzbuzz2, 'fizz';
        }
        elsif ( $i % 5 == 0 ) {
            push @$fizzbuzz2, 'buzz';
        }
        else {
            push @$fizzbuzz2, $i;
        }
    }
    $self->stash( title => 'fizzbuzz', number => $fizzbuzz2 );
    $self->render('fizzbuzz2');
};

@ fizzbuzz2.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= $title %></title></head>
  <body>
  <h1><%= $title %></h1>

  % for my $i (@$number){
  <%= $i %><br>
  % }

  </body>
</html>

気付いたところ

  • 行末の ; 忘れとか、変数名の衝突が起き照る場合は、延々と読み込み中のままになってしまったりする
  • 別の部分のControllerがおかしいと、ほかのページも表示できなくなったりする
  • やっぱり復習大事

簡易掲示板

  • 昨日の講義中はちょっと駆け足でわからなかったので自分でじっくりと。
  • Viewの中のフォームからpostで受け取るときは$self->param(ラベル名)
  • Viewに値を渡すには$self->stash(ハッシュ)
  • できたー!
    • メールアドレス欄にageと入れると、投稿したものが最上位に
    • 投稿順に番号を振る
    • 投稿日時も記録・表示
    • もう少しいじれば2chっぽくなりそう
#!/usr/bin/env perl
use Mojolicious::Lite;
use Time::Piece;

# Documentation browser under "/perldoc"
my $entry;

get '/' => sub {
    my $self = shift;
    $self->stash( body => $entry );
    $self->render('index');
};

post '/post' => sub {
    my $self      = shift;
    my $post_time = localtime;

    if ( $self->param('mail') eq 'age' ) {
        unshift @$entry,
            {
            name => $self->param('name'),
            mail => $self->param('mail'),
            body => $self->param('body'),
            time => $post_time->datetime,
            };
    }
    else {
        push @$entry,
            {
            name => $self->param('name'),
            mail => $self->param('mail'),
            body => $self->param('body'),
            time => $post_time->datetime,
            };
    }
    $self->stash( body => $entry );
    $self->redirect_to('/');
};

app->start;
__DATA__

@@ index.html.ep
% layout 'default';
% title '入力フォーム';
%= form_for '/post' => method => 'POST' => begin
  name:<%= text_field 'name' %>
  mail:<%= text_field 'mail' %>
  body:<%= text_field 'body' %>
  <%= submit_button '投稿する' %>
%= end
<p>
% my $num = 0;
%  for my $i (@$body){
% $num++;
<%= $num %> name:<%= $i->{name} %> mail:<%= $i->{mail} %> time:<%= $i->{time} %> body:<%= $i->{body} %><br>
%  }
</p>


@@ layouts/default.html.ep
<!DOCTYPE html>
<html>
  <head><title><%= title %></title></head>
  <body>
  <%= content %>
  </body>
</html>