ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-02-06

[]西暦<->和暦のスクリプト 21:31 西暦和暦のスクリプト - ishiducaの日記 を含むブックマーク はてなブックマーク - 西暦和暦のスクリプト - ishiducaの日記 西暦和暦のスクリプト - ishiducaの日記 のブックマークコメント

管理の仕事で西暦を和暦に直したり、和暦を西暦に直す機会が多い(モジュールの DateTime::Calendar::Japanese を使った方がいいみたいだけど、ドキュメントを読むのが面倒)ので、スクリプトを書いてみた。(基本的に自分のちょっとした確認用なので、汎用性は低いし、相変わらず手直しポイントは多いと思うけど)

$ perl exchange_year 2003

とすると

H15

と返すような簡単なもので。複数指定できたり、複数指定した場合、西暦と和暦を混合して指定しても使えるようにした。

こんな感じにすると

$ perl exchange_year 1998 H3 S55 1933 T09

こう返す

H10
1991
1980
S08
1920

なお、アルファベットのHは平成。Sは昭和。Tは大正。Mが明治

exchange_year のコード

#!/usr/bin/perl -wl
use strict;

# 引数がない場合は、今年の西暦を代用する
if( scalar @ARGV == 0 ){
    (undef,undef,undef,undef,undef,$ARGV[0]) = localtime(time);
    $ARGV[0] += 1900;
}

foreach( @ARGV ){
    if( /^(M|T|S|H)/i ){
        print &seireki($_);
    } else {
        print &wareki($_);
    }
}
exit;

sub keta{
    $_ = shift;
    return $_ < 10 ? "0".$_ : $_;
    # return "0".$_ if $_ < 10;
    # return $_;
}

sub wareki{
    $_ = shift;
    my $year = '';
    if( $_ < 1912 ){
        $year = &keta($_ - 1867);
        return "M$year";
    } elsif( $_ < 1926 ){
        $year = &keta($_ - 1911);
        return "T$year";
    } elsif( $_ < 1989 ){
        $year = &keta($_ - 1925);
        return "S$year";
    } else {
        $year = &keta($_ - 1988);
        return "H$year";
    }
}

sub seireki{
    $_ = shift;
    my($wagou,$num);
    $wagou = substr($_,0,1);
    $num   = substr($_,1);
    $num   =~ s/^0(\d+)/$1/;
    $num   = $num - 0;
    return $num + 1867 if $wagou =~ /M/i;
    return $num + 1911 if $wagou =~ /T/i;
    return $num + 1925 if $wagou =~ /S/i;
    return $num + 1988 if $wagou =~ /H/i;
}

本当は条件分岐ばっかのコードって好きじゃないけど、面白いアイディアがなかったのでこんな感じで。


追記(2009.02.07)

foreach( @ARGV ){
    if( /^(M|T|S|H)/i ){
        print &seireki($_);
    } else {
        print &wareki($_);
    }
}

foreach( @ARGV ){
    print /^(M|T|S|H)/i ? &seireki($_) : &wareki($_);
}

って端折ってもよかったね

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20090206