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 );
}

とりあえず、今日はここまで...。