Perl で簡易17歳ジェネレータ(サーバサイド版)を作ってみた

「井上喜久子、17歳です♪」「オイオイ」で有名な井上喜久子さんが、2009年 2月 10日に 17歳と 10000日を迎えられたのを遅蒔きながら知りました。既に JavaScript で書かれた 17歳教メンバー 今日の年齢ジェネレイター[初心者ver.] があるので二番煎じな感は否めませんけども、井上喜久子さんの 17歳と 10000日を記念して、Perl でサーバサイド版の簡易17歳ジェネレータを作ってみました。サーバサイドで動く CGI なので、w3mLynx といったテキストWebブラウザや、セキュリティの為に JavaScript を動かさない設定にしてある Webブラウザでも、ちゃんと今日で 17歳と何日なのか分かります。

コードはこちら。

#!/usr/bin/perl -T
# サーバサイド版簡易17歳ジェネレータ

use strict;
use warnings;
use Time::Local;
use CGI;
use CGI::Carp qw/fatalsToBrowser/;

my $home = '../index.html';
my $style_sheet = 'stylesheet.css';
my $mime = $ENV{'HTTP_ACCEPT'} =~ /application\/xhtml\+xml/
    ? 'application/xhtml+xml'
    : 'text/html';
my $cgi = CGI->new();
unless ($cgi->param()) {
    print_xhtml();
} else {
    my $birth = $cgi->param('birthday');
    unless ($birth =~ /^(\d{1,4})-(\d{1,2})-(\d{1,2})$/) {
        print_xhtml('お誕生日は YYYY-MM-DD形式で入力して下さい。');
        exit;
    }
    my ($birth_y, $birth_m, $birth_d) = ($1, $2, $3);
    my ($d, $m, $y) = (localtime)[3..5];
    if ($birth_y < 1902) {
        print_xhtml('ちょっとお姉さん過ぎます。');
    } elsif ($birth_y > 2037) {
        print_xhtml('ちょっと未来過ぎます。');
    } elsif ($birth_y > $y+1900) {
        print_xhtml('まだ生まれていません。');
    } elsif ($birth_m < 1 or $birth_m > 12) {
        print_xhtml('生年月日として間違った月です。');
    } elsif ($birth_d < 1 or $birth_d > 31) {
        print_xhtml('生年月日として間違った日です。');
    } elsif ($birth_y == $y+1900 and $birth_m > $m+1) {
        print_xhtml('まだ生まれていません。');
    } elsif ($birth_y == $y+1900 and $birth_m == $m+1 and $birth_d > $d) {
        print_xhtml('まだ生まれていません。');
    } elsif ($birth_y > $y+1883) {
        print_xhtml('もっとお姉さんになりましょう。');
    } elsif ($birth_y == $y+1883 and $birth_m > $m+1) {
        print_xhtml('もう少しでお姉さんです。');
    } elsif ($birth_y == $y+1883 and $birth_m == $m+1 and $birth_d > $d) {
        print_xhtml('あともう少しでお姉さんです。');
    }
    my $epoch_17day;
    eval {$epoch_17day = timelocal(0, 0, 0, $birth_d, $birth_m-1, $birth_y+17)};
    $@ and print_xhtml('生年月日として間違った日付です。');
    my $epoch_today = timelocal(0, 0, 0, $d, $m, $y);
    my $epoch_diff = $epoch_today - $epoch_17day;
    my $days = $epoch_diff / 60 / 60 / 24;
    print_xhtml("今日のあなたは 17歳と $days 日です。");
}

sub print_xhtml {
    my $msg = shift;
    print <<"EOX";
Content-Type: $mime; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
    "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
  <head>
    <link rel="Stylesheet" href="$style_sheet" title="stylesheet" type="text/css" />
    <title>簡易17歳ジェネレータ</title>
  </head>
  <body>
    <h1>簡易17歳ジェネレータ(サーバサイド版)</h1>
EOX
    unless (defined $msg) {
        print <<"EOH";
    <form method="get" action="$ENV{'SCRIPT_NAME'}">
    <p>あなたが今日で 17歳と何日かを計算します。半角で YYYY-MM-DD形式のお誕生日を入力して下さい。(例:1985-6-2)</p>
      <fieldset>
        <legend accesskey="n">あなたのお誕生日</legend>
        <div>
          <input type="text" name="birthday" id="birthday" />
          <input type="submit" value="決定" />
        </div>
      </fieldset>
    </form>
    <p><a href="$home">戻る</a></p>
EOH
    } else {
        print <<"EOT";
    <p>$msg</p>
    <p><a href="$ENV{'SCRIPT_NAME'}">戻る</a></p>
EOT
    }
    print <<"EOM";
  </body>
</html>
EOM
    exit;
}

やっつけでパパっと書いたので無駄で汚い部分ばっかりですけども、そのうちもうちょっとスマートに書き直すかもしれません。

動作確認環境 : Perl 5.10.1 on Debian GNU/Linux 6.0 squeeze

戻る


Last updated : 2011/03/27
Author : 犬山ぽち丸 / INUYAMA Pochimaru / Pochimaru Inuyama
E-mail : pochi@hoshinoumi.net
Key ID : 4A1B5E85
Key fingerprint : 4605 4D40 6154 20C1 5592 3E54 5A37 FEE9 4A1B 5E85

正当な XHTML 1.1 です 正当な CSS です