Perlがくしゅう帳(Rubyも)

プログラミングの勉強会の参加記録や学んだことなど。 twitter ID : @tomcha_で活動しています。 最近は主にPerl関連の勉強会やコミュニティに参加しています。移転前のブログはこちら->http://ruby.doorblog.jp/

perlでプログラムを書いてみた

Yusukebeさん著の「webサービスの作りかた」を読み始めて、「とりあえず手を動かす」は、重要だなぁと再認識したので、何かを作って見ることにしました。

年末年始の休暇の時間を使って、Perl入学式で学んだこと、ネットの情報、CPANモジュールガイドを駆使して自作プログラムを書ければいいなぁ...と。

とりあえず、最終目標は、基準日から3日毎に、メールでリマインダを送るプログラム。
今使ってるTodoのサービスは、毎日、毎週、毎月の様な繰り返しタスクは自動で設定できるのだけれど、3日毎にTodoを自動予約するパターンが出来ないので、自分で自分のiPhoneにリマインダメールを送るプログラムを書いてみる事に決定。

メールを送る部分はCPANモジュールで何とかなりそうな予感。常時動かしておくサーバーはどうしようか、、、3日毎の定時(決められた時間に)に発動するような事ができるのだろうか???

思いついた部分だけまずはコードにしてみました。

・スタートの基準日をコマンドライン引数にして渡す。
・引数の日と現在日付を比較して、 3の倍数なら、当たりの日(メールを送信する)

日付の比較は、Excelの様に日付をシリアル値に変換して引き算すれば良いかなぁと考えてみたけれど、どうやらPerlの日付は秒数?でカウントされているらしい。日付のシリアル値は無いみたい。

と言うことは、日付からシリアル値を生成する関数を自分で書くしか無いので、とりあえず書いてみました。うるう年の判定ですね。

sub date_tosirial{
    my ( $year,$month,$day) = @_;
    my $ans = 0;
    if( $year < 1900){
        die;
    }elsif( $year == 1900){

    }elsif( $year <= 2000){
        $ans += int(($year-1900)/4)+1+($year-1900)*365;
    }else{
        $ans += int(($year-1900)/4)+1+($year-1900)*365+1;
    };
    my @month_sirial;
    if(($year % 4 == 0)^(($year % 100 != 0)||($year % 400 == 0))){
        @month_sirial = (0,31,29,31,30,31,30,31,31,30,31,30);
    }else{
        @month_sirial = (0,31,28,31,30,31,30,31,31,30,31,30);
    };
    my $item = $month - 1;
    do{
        $ans += $month_sirial[$item];
        $item -= 1;
    }while($item >= 0);
    $ans += $day;
    return $ans;
}; 

 とりあえずは動いているようなので、次はこのサブルーチンのテストを書く事にもチャレンジしてみようと思います。
しかし、正しい答えを計算するExcelが家には無い・・・表計算ソフトが無い・・・
OpenOfficeかGoogleDocsでも計算できるのかなぁ?