日付の存在チェック


 指定した日付が存在するかをチェックする関数を作ってみます。引数は年・月・日の3つを取ります。
sub day_exists {
	my($year, $month, $day) = @_;
	my(@mlast) = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
	
	if ($month < 1 || 12 < $month) { return 0; }
	
	if ($month == 2) {
		if ( (($year % 4 == 0) && ($year % 100 != 0)) || ($year % 400 == 0) ) {
			$mlast[1]++;
		}
	}
	
	if ($day < 1 || $mlast[$month-1] < $day) { return 0; }
	
	return 1;
}

 この関数を呼び出すときは
$result = day_exists($nen, $tsuki, $hi);
のようにすると、$nen年$tsuki月$hi日が存在すれば$resultに1が、存在しなければ0が入ります。
 また、調べたい日付が年、月、日に別れていない場合はsplitsubstrを使用して分けて下さい。
# splitで分割する例
$date = '1999/12/04';
($nen, $tsuki, $hi) = split('/', $date);
$result = day_exists($nen, $tsuki, $hi);

# substrで分割する例
$date = '19990608';
$nen = substr($date, 0, 4);
$tsuki = substr($date, 4, 2);
$hi = substr($date, 6, 2);
$result = day_exists($nen, $tsuki, $hi);
 Date::Simpleモジュールを使って判定することもできます。
use Date::Simple;

my @day = (2005, 2, 29);
print join('/', @day);
if (Date::Simple->new(@day)) {
	print " exists.\n";
} else {
	print " not exists.\n";
}

関連項目

split関数
substr関数