ひとことメッセージ掲示板(Mojolicious::Liteバージョン)
「ひとことメッセージ掲示板」です。これはかんたんプログラミング CGI/Perlの第5章の1節の「ひとことメッセージ掲示板」をMojolicious::Liteを使って書き直したものになっています。
ひとことメッセージ掲示板 short-message-bbs.pl
シンプルな掲示板です。
[f:id:perlcodesample:20100201223906p:image]
ソースコード
ひとことメッセージ掲示板のソースコードです。
#!/usr/bin/env perl
use Mojolicious::Lite;
use utf8;
use Encode qw/encode decode/;
# Data file (app is Mojolicious object. home is Mojo::Home object)
my $data_file = app->home->rel_file('bbs-data.txt');
# Create entry
post '/create' => sub {
my $self = shift; # ($self is Mojolicious::Controller object)
# Form data(This data is Already decoded)
my $title = $self->param('title');
my $message = $self->param('message');
# Display error page if title is not exist.
return $self->render(template => 'error', message => 'Please input title')
unless $title;
# Display error page if message is not exist.
return $self->render(template => 'error', message => 'Please input message')
unless $message;
# Check title length
return $self->render(template => 'error', message => 'Title is too long')
if length $title > 30;
# Check message length
return $self->render(template => 'error', message => 'Message is too long')
if length $message > 100;
# Data and time
my ($sec, $min, $hour, $day, $month, $year) = localtime;
$month = $month + 1;
$year = $year + 1900;
# Format date (yyyy/mm/dd hh:MM:ss)
my $datetime = sprintf(
"%04s/%02s/%02s %02s:%02s:%02s",
$year,
$month,
$day,
$hour,
$min,
$sec
);
# Delete line breakes
$message =~ s/\x0D\x0A|\x0D|\x0A//g;
# Writing data
my $record = join("\t", $datetime, $title, $message) . "\n";
# File open to write
open my $data_fh, ">>", $data_file
or die "Cannot open $data_file: $!";
# Encode
$record = encode('UTF-8', $record);
# Write
print $data_fh $record;
# Close
close $data_fh;
# Redirect
$self->redirect_to('index');
} => 'create';
get '/' => sub {
my $self = shift;
# Open data file(Create file if not exist)
my $mode = -f $data_file ? '<' : '+>';
open my $data_fh, $mode, $data_file
or die "Cannot open $data_file: $!";
# Read data
my $entry_infos = [];
while (my $line = <$data_fh>){
$line = decode('UTF-8', $line);
chomp $line;
my @record = split /\t/, $line;
my $entry_info = {};
$entry_info->{datetime} = $record[0];
$entry_info->{title} = $record[1];
$entry_info->{message} = $record[2];
push @$entry_infos, $entry_info;
}
# Close
close $data_fh;
# Reverse data order
@$entry_infos = reverse @$entry_infos;
# Render index page
$self->render(entry_infos => $entry_infos);
} => 'index';
app->start;
__DATA__
@@ index.html.ep
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
<title>Short Message BBS</title>
</head>
<body>
<h1>Short Message BBS</h1>
<form method="post" action="<%= url_for('create') %>">
<div>
Title
<input type="text" name="title" >
</div>
<div>Message</div>
<div>
<textarea name="message" cols="50" rows="10" ></textarea>
</div>
<div>
<input type="submit" value="Post" >
</div>
</form>
<div>
<% for my $entry_info (@$entry_infos) { %>
<div>
<hr>
<div>Title: <%= $entry_info->{title} %> (<%= $entry_info->{datetime} %>)</div>
<div>Message</div>
<div><%= $entry_info->{message} %></div>
<div>
<% } %>
</div>
</body>
</html>
@@ error.html.ep
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" >
<title>Error</title>
</head>
<body>
<%= $message %>
</body>
</html>
while文を使ってファイルから行を取得して表示しています。
Perlゼミ

