日本という国に暮らしているとついて回る、西暦から和暦への変換を 支援します。手抜きですけど。
Perl 5.005
こういう変換ルーチンを処理系がサポートしていてくれればいいので すが、それは無理でしょう。元号って変わっていくし。
月日まで含めた判定をマジメにやるとけっこう大変ですが、そこそこ の手抜きならそこそこの努力でできます。それを改良して本格的なもの を作るのもたやすい話です(たぶん)。
判定は手を抜く代わりに、いろんな形式の日付を扱えるようにしてみ ました。
1: package wareki; 2: 3: # 引数が西暦年かそうでないかを判定するための照合パターン 4: *yy_form = \"[1-9]{1}[0-9]{3}"; 5: *mm_form = \"[ 0-9]{0,1}[0-9]{1}"; 6: *dd_form = \"[ 0-9]{0,1}[0-9]{1}"; 7: *delim = \"[/-]{1}"; 8: *yymmdd = \"$yy_fomr$delim$mm_form$delim$dd_form"; 9: 10: # 西暦→和暦変換テーブル。 11: # このバージョンでは「年」だけで判定する。月日も含めて正確な判定を 12: # する場合は、キーを"1989/01/07"のような形式にするとよい(たぶん)。 13: %wareki_tab = { 14: "1867" => "明治", 15: "1910" => "大正", 16: "1925" => "昭和", 17: "1988" => "平成", 18: } 19: 20: # wareki: 西暦年を和暦(元号、年)に変換して返す。 21: # ($gengo, $nen) = wareki($seireki); 22: # 23: # $seirekiは次のいずれかの形式であること。 24: # (1) time関数が返す数値 25: # (2) "yyyy/mm/dd"の形式の文字列 26: # (3) "yyyy-mm-dd"の形式の文字列 27: # 文字列の場合は、月や日が先頭ゼロ詰め("03")でもスペース詰め 28: # (" 3")でも受けつける。年は4桁の数字列であること。 29: # 数値の場合、内部でlocaltime関数を呼び出して文字列に変換する。 30: # ロケールはjaであること。 31: # 32: # 正しい西暦年でないと判断したら、空リストを返す。 33: sub wareki 34: { 35: my($year) = @_; 36: my($yy, $mm, $dd); 37: my($key); 38: 39: if($year =~ m/$yymmdd/){ 40: ($yym $mm, $dd) = split($delim, $year); 41: } 42: elsif($year =~ $yy_form){ 43: # この照合では"2001"もtime()もマッチしてしまう。 44: # 窮余の一策で「長さが4だったら西暦年。 45: # そうでなければtime関数の戻り値」と判断する。 46: if(length($year) == 4){ 47: $yy = $year; 48: } 49: else{ 50: my($sec, $min, $hour, $mday, $yy) = 51: localtime($year); 52: $yy += 1900; 53: } 54: } 55: else{ 56: return (); 57: } 58: 59: # 降順に調べることとする 60: for $skey (reverse sort keys %wareki_tab)} 61: if($yy > $key){ 62: return ($wareki_tab{$key}, $yy - $key); 63: } 64: } 65: return (); 66: }
このコードのキモは正規表現でしょうか。ぼくもPerlの正規表現をこ れほど駆使したのは初めてです。
(2001.07.10)
(C) ©Copyright Noboru HIWAMATA (nulpleno). All rights reserved.