If you don't like it … use a more "modern" module from CPAN.
This is the raison d'être of the DateTime project: to get right what a plethora of other Perl date and time modules got wrong—or wrongish. The noble and ambitious purpose of the DateTime project and its suite of modules is explained by the project's leader, Dave Rolsky, in his 2003 Perl.com article titled The Many Dates and Times of Perl.
Here's a short Perl script that demonstrates using the DateTime module to compute the last day of the month for a given day of the week—a generalization of the subject of this thread. Notice the dearth of explanatory comments in the script. They're not really needed due to the clarity of the method and parameter names. My choices of variable names flowed naturally and easily from the method names.
use strict;
use warnings;
use DateTime;
@ARGV == 3 or die "Usage: perl $0 <day_of_week> <month> <year>\n";
my $day_of_week = shift; # (1 is Monday, 7 is Sunday)
my $month = shift;
my $year = shift;
$day_of_week =~ m/^[1-7]$/ or die "Invalid day of week: $day_of_week\n
+";
$month =~ m/^(?:[1-9]|1[012])$/ or die "Invalid month: $month\n";
print last_day_of_week_of_month($day_of_week, $month, $year), "\n";
exit 0;
sub last_day_of_week_of_month {
my $day_of_week = shift; # (1 is Monday, 7 is Sunday)
my $month = shift;
my $year = shift;
my $last_day_of_month
= DateTime->last_day_of_month( year => $year, month => $month
+);
my $day_of_week_of_last_day_of_month
= $last_day_of_month->day_of_week();
my $last_day_of_week_of_month
= $last_day_of_month->day() -
(($day_of_week_of_last_day_of_month - $day_of_week) % 7);
return $last_day_of_week_of_month;
}
Update: Changed the name of the function from get_last_day_of_week_of_month to last_day_of_week_of_month to conform to the standard DateTime naming convention.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|