閏年をチェックする
指定した年が閏年(うるう年)かどうかを調べる Perl/CGIプログラムを作成 してみましょう。
閏年(うるう年)とは、時間のずれを調整するため、約4年に一度2月の日数を1日増やして29日までとする年のことです。
Perl/CGIプログラムの日付や時間計算の基礎についてはこちらのページを参照 してください。
うるう年の計算方法
うるう年は4年に一度というイメージなので、単純に4の倍数で計算したくなりますが…。
実は4の倍数の中でも100の倍数の年はうるう年にはなりません。
また、100の倍数でも400の倍数の年の場合はうるう年となります。
例えば…
1000年はうるう年ではありません。
なぜなら100で割り切れるからです。
これに対して、2000年はうるう年です。
なぜなら、同じように100で割り切れますが、400でも割り切れるからです。
2004年はうるう年です。
なぜなら、100で割り切れなく、4で割り切れるからです。
このようにうるう年の定義というのは少しややこしいので、後述のようにサブルーチン化しておくと便利です。
うるう年を調べる方法(1)
うるう年をチェックする Perl/CGIプログラムを作成 してみましょう。
#!/usr/bin/perl
use strict;
my $thisyear = 1900 + (localtime(time))[5];
print "Content-type: text/html; charset=shift_jis\n\n";
for (my $i=$thisyear-10;$i<=$thisyear+10;$i++) {
if (&LeapYearCheck($i)) {
print $i, "年はうるう年です。<br>\n";
} else {
print $i, "年はうるう年ではありません。<br>\n";
}
}
exit;
sub LeapYearCheck {
my $year = shift;
if (($year % 4 == 0 && $year % 100 != 0) || ($year % 400 == 0)) {
return 1;
} else {
return 0;
}
}
__END__
Perl/CGIプログラムサンプル はこちらに設置してあります。
このPerl/CGIプログラムサンプルにアクセスすると、今年を基準としてその前後10年がうるう年であるかどうかを調べて表示します。
Perl/CGIプログラム解説
メイン処理では、まず今年を 変数 「$thisyear」に代入しています。
今年が何年であるかを求めるには、 localtime関数の引数にtime関数から返された値を渡して取得 します。
しかし、localtime関数から返される値というのは 配列 形式になっており、それぞれの要素ごとにあらわしているものが決まっています。
年を表しているのは6番目の要素です。
なので、添え字5を指定し、返された値に1900をたし合わせることにより現在の年を取得することができます。
あとは、 forループ で今年を基準に前後10年の値を変化させながら回していきます。
LeapYearCheck関数
LeapYearCheck関数は、引数に年号を渡すと、その年がうるう年かどうかを調べる サブルーチン です。
うるう年であった場合には1を返し、うるう年でなかった場合には0を返します。
なので、上記Perl/CGIプログラムサンプルのように、戻り値を if文 で判定させると、簡単に指定した年がうるう年であるかどうかがわかります。
うるう年を調べるには、前述のうるう年の定義である「4で割り切れるが100では割り切れない年、もしくは400で割り切れる年」というのをif文にし判定しています。
うるう年を調べる方法(2)
うるう年を調べるPerl/CGIプログラムは、こんなふうに作成することもできます。
#!/usr/bin/perl
use strict;
my $thisyear = 1900 + (localtime(time))[5];
print "Content-type: text/html; charset=shift_jis\n\n";
for (my $i=$thisyear-10;$i<=$thisyear+10;$i++) {
if (&LeapYearCheck($i)) {
print $i, "年はうるう年です。<br>\n";
} else {
print $i, "年はうるう年ではありません。<br>\n";
}
}
exit;
sub LeapYearCheck {
my $year = shift;
return 1 if (($year % 400) == 0);
return 0 if (($year % 100) == 0);
return 1 if (($year % 4) == 0);
return 0;
}
__END__
Perl/CGIプログラムサンプル はこちらに設置してあります。
表示結果は前述のものと同じです。
Perl/CGIプログラム解説
このPerl/CGIプログラムサンプルは、前述のものとほとんど同じです。
メイン処理部分はまったく同じです。
LeapYearCheck関数の引数戻り値ともに同じです。
違うのはLeapYearCheck関数の中身のみです。
見ていただければわかるように、うるう年の判定部分がかなりわかりやすくなっています。
if文が成立すれば、return関数でどんどん抜けていく仕組みです。
まずは、400で割り切れれば無条件でうるう年です。
もし400で割り切れなかった場合は以下の処理をします。
まず、100で割り切れればうるう年ではありません。
それ以外で4で割り切れればうるう年です。
残りはすべてうるう年ではありません。