#perl #scripting
#perl #сценарии
Вопрос:
Я хочу написать скрипт, который генерирует даты между настоящим моментом и прошлым годом в perl.
Пример
<option value="01/02/2010">Feb 07</option>
<option value="01/03/2010">Mar 07</option>
<option value="01/04/2010">Apr 07</option>
<option value="01/05/2010">May 07</option>
<option value="01/06/2010">Jun 07</option>
<option value="01/07/2010">Jul 07</option>
<option value="01/08/2010">Aug 07</option>
<option value="01/09/2010">Sep 07</option>
<option value="01/10/2010">Oct 07</option>
<option value="01/11/2010">Nov 07</option>
<option value="01/12/2010">Dec 07</option
Я понятия не имею, как я могу это сделать. Пока я делаю это вручную
Комментарии:
1. Я думаю, что модуль «DateTime:: Duration» может помочь вам в этом случае. search.cpan.org /~drolsky/DateTime-0.70/lib/ DateTime /Duration.pm
Ответ №1:
Отрегулируйте форматирование и сумму, вычитаемую по вкусу.
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
my $now = DateTime->now;
my $start_of_last_year = DateTime->new( year => $now->year - 1 );
while ( $now > $start_of_last_year ) {
print $now->ymd('/'), "n";
$now->subtract( days => 1 );
}
Ответ №2:
Попробуйте:
#!/usr/bin/env perl
use strict;
use warnings;
use POSIX;
my $Now = time;
my @Now = localtime( $Now );
for my $count ( 1 .. 12 ){
# month/day/year
print strftime( "%m/%d/%Yn", @Now );
$Now[4] --;
if( $Now[4] < 0 ){
$Now[4] = 11;
$Now[5] --;
}
}
Комментарии:
1. Извините, но ваш цикл для меня странный: вы вообще не используете
$count
2. Вам не нужно соблюдать осторожность
$Now[4]
Perl сделает то, что вы имеете в виду.
Ответ №3:
use 5.010;
use strict;
use warnings;
use POSIX qw<strftime>;
my @loc = localtime();
for ( 1..12 ) {
say strftime( qq{<option value="01/%m/%Y">%b 07</option>}, @loc );
$loc[4]--;
}
Вывод:
<option value="01/05/2011">May 07</option>
<option value="01/04/2011">Apr 07</option>
<option value="01/03/2011">Mar 07</option>
<option value="01/02/2011">Feb 07</option>
<option value="01/01/2011">Jan 07</option>
<option value="01/12/2010">Dec 07</option>
<option value="01/11/2010">Nov 07</option>
<option value="01/10/2010">Oct 07</option>
<option value="01/09/2010">Sep 07</option>
<option value="01/08/2010">Aug 07</option>
<option value="01/07/2010">Jul 07</option>
<option value="01/06/2010">Jun 07</option>
Просто для усмешек, альтернативная сжатая версия:
use 5.010;
use strict;
use warnings;
use POSIX qw<strftime>;
say join( "n"
, map {
my $t = strftime( qq{<option value="01/%m/%Y">%b 07</option>}, @$_ );
$_->[4]--;
$t;
}
(( [ localtime ] ) x 12 )
);
Ответ №4:
Использование Date::Simple
#!/usr/bin/perl
use strict;
use warnings;
use 5.012;
use Date::Simple qw/ today ymd /;
my $now = today;
for (my $date = ymd($now->year, 1, 1); $date <= $now; $date ) {
say $date;
}
Если вам нужен прошлый год (не начало этого года), вы могли бы вызвать ‘ymd’ в цикле как:
ymd($now->year()-1, 1, 1);
Ответ №5:
Еще один модуль, на который стоит обратить внимание, — это Date::Calc. Мне нужен был модуль, чтобы заменить некоторые неудобные вычисления дат для одного из моих сценариев, и, похоже, он делает все, что мне когда-либо понадобится. http://metacpan.org/pod/Date::Calc
Комментарии:
1. Не хватает Zoneinfo / исторических часовых поясов, микросекунд и високосных секунд. По сравнению с DateTime, D:: C действительно убогий.