También podría usar Time :: ParseDate, que comprende "el último lunes".
Una sola línea para mantener la reputación de Perl:
perl -MTime::ParseDate -M'POSIX qw(strftime)' -l -e'foreach (@ARGV) { my $now= parsedate($_); my $e= parsedate("last Monday", NOW => $now) ; print "$_ : ", strftime "%F", localtime($e)}' 2011-06-11 2011-06-12 2011-06-13 2011-06-14
y un guión cuerdo:
#!/usr/bin/perl
use strict;
use warnings;
use Time::ParseDate; # to parse dates
use POSIX qw(strftime); # to format dates
foreach my $date (@ARGV)
{ my $date_epoch= parsedate($date) || die"'cannot parse date '$date'\n";
my $monday= parsedate("last Monday", NOW => $date_epoch); # last Monday before NOW
print "Monday before $date: ", strftime("%F", localtime($monday)), "\n"; # %F is YYYY-MM-DD
}
Un par de notas: si la fecha es un lunes, a continuación, se obtiene el anterior Lunes, que puede o no ser lo que desee, para cambiar el que acaba de establecer AHORA al día siguiente (agregue 60 * 60 * 24, un día, a $ date_epoch). Entonces Time :: ParseDate es bastante liberal, se analizará felizmente 2011-23-38 por ejemplo (como 2012-12-09).
.. decir ah ¿Ya has tenido éxito en esto? ¿Qué intentaste? – Flexo