Perl でカレンダーモジュール2
前回、休日取得関数を作成したところで、振替休日の処理で止まってしまっていたが、やっと作業再開だ。
振替休日処理は、よく考えてみると、5月の連休の処理が結構面倒くさかった。
ついでに、データは二次元配列で渡したほうがラクなので、戻り値を二次元配列にしてみた。
#---------------------------------------------------------------------------- # 休日所得(月・日・休日名称の、二次元配列を返す) # @holiday = get_holiday ( 西暦, ファイル名 ); #---------------------------------------------------------------------------- sub get_holiday { local ( $year, $file ) = @_; undef @hd; $childs_day = 0; open ( IN, "$file" ) || &error ( 'エラー','$fileファイルが開けません' ); foreach () { $_ =~ s/\n//; ( $mon, $day, $str ) = split; # ハッピーマンデー if ( ( $day eq "HM2" ) || ( $day eq "HM3" ) ) { $day =~ s/HM//ig; $result = &get_happymonday ( $year, $mon, int ( $day ) ); push @hd, [ $mon, $result, $str ]; } else { # 春分の日 if ( $day eq "SPR" ) { $day = &get_spring ( $year ); } # 秋分の日 if ( $day eq "AUT" ) { $day = &get_autumn ( $year ); } $result = $day; # 振替休日 if ( &get_week ( $year, $mon, $day ) == 0 ) { $result = int ( $result ) + 1; # 5月の連休用振替休日 if ( ( $mon == 5 ) && ( ( $day == 3 ) || ( $day == 4 ) ) ) { $childs_day = 1; push @hd, [ $mon, $day, $str ]; } else { push @hd, [ $mon, $day, $str ]; push @hd, [ $mon, $result, "振替休日" ]; } } elsif ( ( $mon == 5 ) && ( $day == 5 ) && ( $childs_day == 1 ) ) { push @hd, [ $mon, $day, $str ]; push @hd, [ $mon, 6, "振替休日" ]; } else { push @hd, [ $mon, $day, $str ]; } } close ( IN ); } return ( @hd ); }
次は、スケジュールデータの取得。下の様なデータファイルを用意して...
02 16:00 19:00 全体練習 グラウンド 03 08:00 12:00 練習試合 ちょろっと球場 05 16:00 19:00 全体練習 グラウンド 07 16:00 19:00 練習 体育館 09 15:00 17:00 公式戦 ちょろっとドーム
こんな感じでファイルを読み込ませて、二次元配列化してしまおう。
#---------------------------------------------------------------------------- # スケジュールデータ取得(二次元配列を返す) # @schedule = get_schedule ( 西暦, 月 ); #---------------------------------------------------------------------------- sub get_schedule { local ( $year, $mon ) = @_; undef @schedule; $file = "$year-$mon.dat"; open ( IN, "$file" ) || &error ( 'エラー','ファイルが開けません' ); foreach () { $_ =~ s/\n//; push @schedule , [ split ]; close ( IN ); } return ( @schedule ); }
とりあえず、今日はここまで...。