日付の存在チェック
指定した日付が存在するかを調べる Perl/CGIプログラムを作成 してみましょう。
予定表や予約受付時など、日付を指定する場面はたくさんあります。
その際、 Perl/CGIプログラム 側で本当にその日付が存在するのかをチェックするプロセスを用意しておくことはとても大切です。
Perl/CGIプログラム作成
何年何月何日かを指定すると、その指定した日付が本当に存在するかどうかをチェックするPerl/CGIプログラムを作成してみましょう。
#!/usr/bin/perl
use strict;
my $Year = 1900 + (localtime(time))[5];
print "Content-type: text/html; charset=shift_jis\n\n";
print $Year, "年<br><br>\n";
for (my $Month=1;$Month<=12;$Month++) {
my $Day = 31;
if ($Month == 2) {$Day = 29;}
if (&DateCheck($Year, $Month, $Day)) {
print $Month, "月", $Day, "日は存在します。<br>\n";
} else {
print $Month, "月", $Day, "日は存在しません。<br>\n";
}
}
exit;
sub DateCheck {
my($year, $month, $day) = @_;
my %lastday = (1=>31, 2=>'', 3=>31, 4=>30, 5=>31, 6=>30, 7=>31, 8=>31, 9=>30, 10=>31, 11=>30, 12=>31);
if (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)) {
$lastday{2} = 29;
} else {
$lastday{2} = 28;
}
if (($month < 1) or ($month > 12)) {
return;
}
if (($day < 1) or ($day > $lastday{$month})) {
return;
}
return 1;
}
__END__
Perl/CGIプログラムサンプル はこちらに設置してあります。
このPerl/CGIプログラムサンプルを実行すると、今年の各月に対して、31日または29日が存在するかどうかを調べてその結果を表示します。
Perl/CGIプログラム説明
このPerl/CGIプログラムサンプルについて説明します。
メイン処理
メイン処理では、今年一年の各月に対して、31日(2月は29日)を指定し、本当に日付が存在するかどうかを サブルーチン DateCheckで調べその結果を表示しています。
今年が何年であるかを調べるには、 localtime関数の引数にtime関数からの戻り値を指定 し、さらに1900をたします。
ただし、localtime関数から返される値は 配列 形式になっており、年号を表す値は6番目の要素に格納されているので取り出す必要があります。
添え字は0からはじまるので、5番目の要素を指定することにより年号の値のみ取り出すことができます。
こうして 変数 「$Year」に今年が何年であるかを格納します。
次に、 for関数 で1月から12月までループさせます。
その間、2月は29日、それ以外の月は31日を指定し、DateCheck関数と if文 を使って指定した日付が存在するかどうかをチェックしその結果を表示させています。
DateCheck関数
サブルーチン DateCheckについて説明します。
DateCheck関数は、調べたい日付(何年何月何日)を指定すると、本当に存在するかを調べてその結果を返します。
引数は、指定する日付で、年・月・日の順で渡します。
戻り値は調べた結果で、引数に指定した日付が存在していれば1、それ以外であれば何も返しません。
なのでメイン処理のように、戻り値をif文で判定させると簡単に日付の存在をチェックできます。
指定した日付の存在をチェックするには、以下のプロセスを踏みます。
まず、 連想配列 「%lastday」に各月の月末日を定義します。
その際、指定した年が うるう年であるかを調べ て適切な値を指定しておくことがポイントです。
あとは、月であれば1から12、日であれば1から定義した月末日のように、値が適切であるかをif文で判定してその結果を返し終了です。