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.