簡易検索アプリケーション(Mojolicious::Liteバージョン)
簡易な検索アプリケーションです。これはかんたんプログラミング CGI/Perlの第5章の3節の「簡易検索アプリケーション」をMojolicious::Liteを使って書き直したものになっています。
簡易検索アプリケーション
簡易検索アプリケーションです。
検索ページ
[f:id:yukikimoto:20100219230809p:image]
検索結果ページ
[f:id:yukikimoto:20100219230811p:image]
登録ページ
[f:id:yukikimoto:20100219231044p:image]
ソースコード
検索アプリケーションのソースコードです。
use Mojolicious::Lite;
use utf8;
use Scalar::Util 'looks_like_number';
use Encode qw/encode decode/;
use File::Path 'mkpath';
use File::Basename 'dirname';
# Data file(absolute path)
my $data_file = app->home->rel_file('search-person/data.txt');
unless (-f $data_file) {
# Create data directory
my $data_dir = dirname($data_file);
unless (-d $data_dir) {
mkpath($data_dir)
or die "Cannot create directory '$data_dir'";
}
# Create file
open my $fh, '>', $data_file
or die "Cannot create file '$data_file': $!";
close $fh;
}
# Search page(This is top page)
get '/' => sub {
shift->render(title => 'Search page');
} => 'index';
# Data registering page
get '/register' => sub {
shift->render(title => 'Resist page');
} => 'register';
# Search result
get '/search-result' => sub {
my $self = shift;
my $height_min = $self->param('height-min');
my $height_max = $self->param('height-max');
# Parameter error
my $error =
!looks_like_number($height_min) ? 'Height min must be a number'
: !looks_like_number($height_max) ? 'Height max must be a number'
: undef;
# Render error page
return $self->render(
template => 'error',
title => 'Error page',
message => $error
) if $error;
# Open
open my $fh, '<', $data_file
or die "Cannot open file '$data_file': $!";
# Search
my $persons = [];
while (my $line = <$fh>) {
# Decode
$line = decode('UTF-8', $line);
# Remove line break
chomp $line;
# Split line
my @record = split("\t", $line);
# Person
my $person = {};
$person->{name} = $record[0];
$person->{height} = $record[1];
# Match
if ($person->{height} >= $height_min &&
$person->{height} <= $height_max)
{
push @$persons, $person;
}
}
$self->render(title => 'Search result', persons => $persons);
} => 'search-result';
# Post data
post '/post' => sub {
my $self = shift;
# Parameter
my $name = $self->param('name');
my $height = $self->param('height');
# Parameter error
my $error = !$name
? 'You must be specify name'
: ! looks_like_number($height)
? 'Height must be a number'
: undef;
# Render error page
return $self->render(template => 'error', title => 'Error page',
message => $error)
if $error;
# Open
open my $fh, '>>', $data_file
or die "Cannot open file '$data_file': $!";
# Line
my $line = join "\t", $name, $height;
# Print
print $fh encode('UTF-8', $line) . "\n";
close $fh;
# Redirect
$self->redirect_to('register');
} => 'post';
app->start;
__DATA__
@@ layouts/default.html.ep
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
<title>Simple Search - <%= $title %></title>
</head>
<body>
<%= content %>
</body>
</html>
@@ index.html.ep
% layout 'default';
<h1>Simple Search - <%= $title %></h1>
<form method="get" action="<%= url_for('search-result') %>">
<div>
Search person informations.
</div>
<div>
Height
<input type="text" name="height-min"> -
<input type="text" name="height-max">
</div>
<div>
<input type="submit" value="Search" >
</div>
</form>
<div>
<a href="<%= url_for('register') %>">Go to register page.</a>
</div>
@@ register.html.ep
% layout 'default';
<h1>Simple Search - <%= $title %></h1>
<form method="post" action="<%= url_for('post') %>">
<div>
Resist person information.
</div>
<div>
Name
<input type="text" name="name" >
</div>
<div>
Height
<input type="text" name="height">
</div>
<div>
<input type="submit" value="Resister" >
</div>
</form>
<div>
<a href="<%= url_for('index') %>">Go to search page</a>
</div>
@@ error.html.ep
% layout 'default';
<h1>Simple Search - <%= $title %></h1>
<%= $message %>
@@ search-result.html.ep
% layout 'default';
<h1>Simple Search - <%= $title %></h1>
<div>
<a href="<%= url_for('index') %>">Go to Searching page</a>
<a href="<%= url_for('register') %>">Go to Resisting page</a>
</div>
<div>
% for my $person (@$persons) {
<div>
<hr>
<div>Name: <%= $person->{name} %></div>
<div>Height: <%= $person->{height} %></div>
<div>
% }
</div>
while文を使ってファイルから行を取り出しています。
Perlゼミ

