Как конвертировать форматы даты в Perl без импорта внешних модулей? - PullRequest
3 голосов
/ 06 мая 2009

Вероятно, простой ответ: как мне конвертировать это без импорта внешних модулей? Я прочитал CPAN, но не смог точно указать метод, который выполняет следующее:

Convert: 20080428 to 28-APR-08

Есть идеи?

Буду признателен даже за направление меня на учебник.

С уважением, PIAS

Ответы [ 3 ]

3 голосов
/ 06 мая 2009

Этот код не работает в Y10k, но этого должно быть достаточно. Регулярное выражение может быть более строгим, но если дата уже была подтверждена (или будет подтверждена в новой форме), то это не имеет значения.

#!/usr/bin/perl

use strict;
use warnings;

my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;

my $d = "20080428";

$d =~ s/..(..)(..)(..)/$3-$mon[$2]-$1/;

print "date is now $d\n";

Или, если вы ненормальный и хотите проверить в регулярном выражении (требуется Perl 5.10):

#!/usr/bin/env perl5.10.0

use strict;
use warnings;

my @mon = qw/null JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC/;

my $d = join '', @ARGV;

# only validates between 1600 and 9999
# because of calendar weirdness prior to 1600 
$d =~ s/
    ^
    (?:
        # non-leap years and everything but 29th of Feb in leap years
        (?:
            1[6-9]     (?<y> [0-9]{2}) | 
            [2-9][0-9] (?<y> [0-9]{2})
        )
        (?: #any month 1st through 28th
            (?: (?<m> 0[1-9] | 1[0-2]) (?<d> 0[0-9] | 1[0-9] | 2[0-8]) )
            | #or 30th of any month but 2
            (?: (?<m>0[13-9] | 1[0-2]) (?<d> 30) )
            | # or 31st of 1, 3, 5, 7, 8, 10, or 12
            (?: (?<m>0[13578] | 1[02]) (?<d> 31) )
        )
        | # or 29th of Feb in leap years
        (?:
            (?: #centuries divisible by 4 minus the ones divisible by 100
                16          |    
                [2468][048] |
                [3579][26]
            )
            (?<y> 00)
            | #or non-centuries divisible by 4
            (?: 1[6-9] | [2-9][0-9] )
            (?<y>
                0[48]       | 
                [2468][048] |
                [13579][26]
            )
        )
        (?<m> 02) (?<d> 29)
    )
    $
/$+{y}-$mon[$+{m}]-$+{d}/x or die "invalid date: $d";

print "date is now $d\n";
2 голосов
/ 06 мая 2009
my %map = ( '01' => 'JAN', '02' => 'FEB', '03' => 'MAR', '04' => 'APR' ); # You can do the rest yourself ;-)
my $in = '20080428';
if ( $in =~ m/..(..)(..)(..)/ ) {
    my ( $y, $m, $d ) = ( $1, $2, $3 );
    my $out = sprintf '%02d-%s-%02d', $d, $map{$m}, $y;
}   
else {
    die "Illegal date format";
}   
2 голосов
/ 06 мая 2009

Вы проверили эти адреса http://www.go4expert.com/forums/showthread.php?t=15533 и эта документация Perl http://perldoc.perl.org/functions/localtime.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...