#!/usr/bin/perl -w package romandate; @EXPORT_OK = qw(decToRoman romanToDec romanTimeStr); use Exporter qw(import); use warnings 'all'; use strict; my $codes = [ { d => 1000, r => 'M', }, { d => 900, r => 'CM', }, { d => 500, r => 'D', }, { d => 400, r => 'CD', }, { d => 100, r => 'C', }, { d => 90, r => 'XC', }, { d => 50, r => 'L', }, { d => 40, r => 'XL', }, { d => 10, r => 'X', }, { d => 9, r => 'IX', }, { d => 5, r => 'V', }, { d => 4, r => 'IV', }, { d => 1, r => 'I', }, ]; my $rcodes = { 'M' => 1000, 'D' => 500, 'C' => 100, 'L' => 50, 'X' => 10, 'V' => 5, 'I' => 1, }; my $days = [ 'SOLIS', 'LUNAI', 'MARTIS', 'MERCURI', 'LOVIS', 'VENERIS', 'SATURNI', ]; my $months = [ 'IANUARIS', 'FEBRUARIUS', 'MARTIUS', 'APRILIS', 'MAIUS', 'IUNIUS', 'IULIUS', 'AUGUSTUS', 'SEPTEMBER', 'OCTOBERR', 'NOVEMBER', 'DECEMBER', ]; sub decToRoman { my $dec = shift; if (($dec <= 0) || ($dec > 4000) || ($dec - int($dec))) { return "_err"; } else { my $r = ''; for (my $i=0; $i<@{$codes}; $i++) { while ($dec >= $codes->[$i]{d}) { $r .= $codes->[$i]{r}; $dec -= $codes->[$i]{d}; } } return $r; } } sub romanToDec { my $rom = shift; $rom =~ s/[^M^D^C^L^X^V^I]//; my $roml = length($rom); my $dec = 0; for (my $i=0;$i<$roml;$i++) { my $c = substr($rom,$i,1); my $cv = $rcodes->{$c}; if ($i < ($roml-1)) { my $cn = substr($rom,$i+1,1); my $cnv = $rcodes->{$cn}; if ($cnv > $cv) { $dec += $cnv - $cv; $i++; } else { $dec += $cv; } } else { $dec += $cv; } } return $dec; } sub romanTimeStr { my $now = shift; if (!defined($now)) { $now = time; }; my @tm_array = localtime($now); # Tue Nov 20 16:46:47 2007 my $day = $days->[$tm_array[6]]; my $mont = $months->[$tm_array[4]]; my $date = decToRoman($tm_array[3]); # print $tm_array[3] . "\n"; # print $date . "\n"; exit(); my $hour = decToRoman($tm_array[2]); my $minu = decToRoman($tm_array[1]); my $sec = decToRoman($tm_array[0]); my $year = decToRoman($tm_array[5] + 1900); if ($date =~ /_err/) { $date = ''; }; if ($hour =~ /_err/) { $hour = ''; }; if ($minu =~ /_err/) { $minu = ''; }; if ($sec =~ /_err/) { $sec = ''; }; if ($year =~ /_err/) { $year = ''; }; my $tm_str = $day . " " . $mont . " " . $date . " " . $hour . ":" . $minu . ":" . $sec . " " . $year; return $tm_str; } 1;