Time::Pieceでcalコマンドっぽいものを実装する
ぽいものっていうのは、
日曜始まりじゃなくて月曜始まりって意味なんだけど、
今思うと、なんで月曜始まりにこだわったのか分かんない。。。
use v5.14;
use strict;
use warnings;
use utf8;
use Time::Piece;
sub usage {
say "Usage:
perl $0 Month(1-12) Year(1900-)
ex.) perl $0 9 2014";
exit( 0 );
}
if ( scalar(@ARGV) != 2 ) {
usage();
}
my ( $month, $year ) = @ARGV;
if ( $year < 1900 ) {
say "Year is invalid. ---> Year: $year";
usage();
}
if ( $month < 1 or 12 < $month ) {
say "Month is invalid. ---> Month: $month";
usage();
}
my $t = Time::Piece->strptime( "$year-$month-1", '%Y-%m-%d' );
my $n = $t->month_last_day();
my $week = $t->day_of_week(); # Sunday: 0
my $offset = ( $week == 0 ) ? 6 : ($week - 1);
binmode( STDOUT, ':utf8' );
printf( " %2d月 %d\n", $month, $year );
print "月 火 水 木 金 土 日\n";
my $i = 0;
for (; $i<$offset; $i++) {
printf( "%2s", '' );
print " ";
}
foreach my $day ( 1..$n ) {
printf( "%2d", $day );
$i++;
if ( 7 <= $i and $day != $n ) {
print "\n";
$i = 0;
}
else {
print " ";
}
}
print "\n";
実行するとこんな感じ。
$ perl aaa.pl 9 2014
9月 2014
月 火 水 木 金 土 日
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
きっと、こういうことするモジュールあるんだろうなぁ・・・。
おしまい。
Leave a Comment