我想要获得本月的最后一个星期五.我找到了可以完成这项工作的awtome awk脚本.我尝试将其移植到perl但面临一些问题.任何见解都会有很大的帮助.我不能使用除内置模块之外的任何perl模块,这就是为什么我必须完成构建这些东西.
谢谢你的帮助.
AWK脚本:
BEGIN {
split("31,28,31,30,31,30,31,31,30,31,30,31",daynum_array,",") # days per month in non leap year
year = ARGV[1]
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
daynum_array[2] = 29
}
y = year - 1
k = 44 + y + int(y/4) + int(6*(y/100)) + int(y/400)
for (m=1; m<=12; m++) {
k += daynum_array[m]
d = daynum_array[m] - (k%7)
printf("%04d-%02d-%02d\n",year,m,d)
}
exit(0)
}
Run Code Online (Sandbox Code Playgroud)
我的Perl脚本:
my @time = localtime;
my ($month, $year) = @time[4, 5];
$year += 1900;
@months = qw( 31 28 31 30 31 30 31 31 30 31 30 31 );
$months[1] = check_leap_year($year) ? 29 : 28;
$y = $year - 1;
$k = 44 + $y + int($y / 4) + int(6 * ($y / 100)) + int($y / 400);
$k += $months[$month];
$d = $months[$month] - ($k % 7);
$month += 1;
printf "%04d-%02d-%02d\n", $year, $month, $d;
sub check_leap_year {
my $year = shift;
return 0 if $year % 4;
return 1 if $year % 100;
return 0 if $year % 400;
return 1;
}
Run Code Online (Sandbox Code Playgroud)
有几种方法可以做到这一点.使用Time :: Piece并不是最简单的,它不是为日期数学设计的,但您不必安装其他软件.
use v5.10;
use strict;
use warnings;
use Time::Piece;
sub get_last_dow_in_month {
my($year, $month, $dow) = @_;
# Get a Time::Piece object at the last day of the month.
my $first_of_the_month = Time::Piece->strptime("$year $month", "%Y %m");
my $last_day = $first_of_the_month->month_last_day;
my $last_of_the_month = Time::Piece->strptime("$year $month $last_day", "%Y %m %d");
# Figure out how many days you need to go back.
my $days_offset = -(($last_of_the_month->day_of_week + (7 - $dow)) % 7);
return $last_of_the_month->mday + $days_offset;
}
say get_last_dow_in_month(2014, 3, 5);
Run Code Online (Sandbox Code Playgroud)
如果您需要进行更多日期处理,DateTime是最全面的.
模块可以使用.PerlMonks上个月的最后一个计算包含一些例子.
例如
$ perl -MDate::Manip -E 'say UnixDate(ParseDate("last Friday in March 2015"),"Last Friday of the month is %B %E, %Y.")
Last Friday of the month is March 27th, 2015.
您需要解决妨碍工作技术方面的社会限制,而不是解决技术限制.