A word message board (Mojolicious::Lite version)
It is a "word message board". This is a rewrite of Easy Programming CGI / Perl, Chapter 5, Section 1, "A Word Message Board" using Mojolicious::Lite. I am.
A word message board short-message-bbs.pl
It is a simple bulletin board.
[f: id: perlcodesample: 20100201223906p: image]
Source code
A word This is the source code of the message board.
#! / 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 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>
I'm using while statement to get a line from a file and display it.
Mojolicious Tutorial